一、issubclass()用于判断类对象与类对象之间的关系
- 接受两个实参,第一个是实参是类对象,第二个实参是类对象或由类对象组成的元组
- 当第二个实参是类对象时,如果第一个实参是第二个实参的子类,那么返回True
- 当第二个实参是类对象组成的元组时,如果第一个实参是第二个实参中任意一个类对象的子类,返回True
class A(object):
pass
class B(object):
pass
class C(object):
pass
class D(A) :
pass
print(issubclass(D, A)) # True
print(issubclass(D, B)) # False
print(issubclass(D, (B, A, C))) # True
print(issubclass(D, (B, C)))# False
二、isinstance()用于判断实例对象与类对象之间的关系
- 接受两个实参,第一个实参是实例对象,第二个实参是类对象或由类对象组成的元组
- 当第二个实参是类对象时,如果第一个实参是第二个实参的实例对象,或者第一个实参是第二个实参的子类的实例对象,那么返回True
- 当第二个实参是类对象组成的元组时,如果第一个实参是第二个实参中任意一个类对象或其子类的实例对象,那么返回True
class A(object):
pass
class B(object):
pass
class C(object):
pass
class D(A):
pass
print(isinstance(D(), D)) # True
print(isinstance(D(), A)) # True
print(isinstance(D(), (D, B, C))) # True
print( isinstance(D(), (B, A, C)))# True
三、type()用于获得指定对象的类型
- 实例对象的类型是其对应的类对象
- 类对象的类型是type,也就是说,类对象是type的一个实例对象
- 自定义函数的对象的类型是function
- 内置函数对象的类型是builtin_function_or_method
- 可以使用运算符==判断某个对象的类型是否是指定的类型
- 对于基本数据类型,可以直接使用其对应的类名;如果不是基本数据类型,需要使用标准库中的模块types中定义的变量
def do_ sth():
pass
print (type(do_ _sth)) #<class 'function' >
print (type (dir)) #<class ' builtin_ function_ or_ method'>
print (type (dir())) #<class list' >
print (type(18) = int) #True
四、dir()用于获得其所有可以访问的属性和方法(包括从父类中继承的属性和方法)的列表
- 类对象与实例对象的结果是有区别的,类对象的结果中不包括实例属性
- 调用内置函数dir()后的返回值中,很多属性和方法都是以双下划线__开头和结尾的,这些属性和方法中的绝大多数都继承自类object
- 特殊属性和特殊方法都是系统预定义的,我们自定义的属性名和方法名不要以双下划线__开头和结尾
- 在我们自定义类对象时,经常会重写一个或多个特殊方法,例如__init__。特殊方法会在特定的情形下被自动调用,很少需要手动调用特殊方法
五、属性之增删改查
- hasatter(object,name)用于判断指定的对象object是否有参数name指定的属性或方法
- getattr(object,name[,default])用于获得指定的对象object中名为name的属性或方法。如果不指定参数default,那么当object中不存在名为name的属性或方法时,抛出AttributeError,如果指定了参数default,那么当object中不存在名为name的属性或方法时,就会返回default。
- setattr(object,name,vaule)用于在指定的对象object中添加或修改名为参数name的属性或方法,添加或修改后的value
- delattr(object,name)用于删除指定的对象object中名为参数name的属性或方法
class MyClass (object):
def __init__ (self):
self.x = 1
def do_sth(self):
print(" do_sth被调用')
mc =MyClass()
print (hasattr(mc, 'x' )) #True
print (hasattr (mc,.'do_sth')) #True
print (hasattr(mc,' y' )) #False
print (getattr(mc, 'x' )) #1
print (getattr(mc, 'y' )) #报错
print(getattr(me, 'y', 2)) #2
print (getattr(me, 'y,’ 查找的属性或方法不存在’)) #查找的属性或方法不存在
f = getattr(me, 'do_sth' )
f() #do_ sth被调用
setattr (mc,'z',3) #等价于 mc.z=3
print (getattr(mc,' 2' )) #3
delattr(mc, , z' )
print (hasattr(mc, 'z' )) #False
六、算术运算符重载
- 标准算数运算符在默认情况下不能用于自定义类对象的实例对象
- 如果想让标准算数运算符可以用于自定义类对象的实例对象,必须在自定义类对象中实现标准算术运算符对应的以下特殊方法:
符号 | 对应的特殊方法 |
---|
+ | _add_()和__radd__() |
- | _sub_()和__rsub__() |
* | _mul_()和__rmul__() |
/ | _trudiv_()和__rtruediv__() |
// | _floordiv_()和__rfloordiv__() |
class MyClass1 (object) :
def __add__ (self, other) :
return ”这是__add__+的结果”
class MyClass2 (object) :
def __ radd__ (self, other) :
return "这是__radd__ +的结果"
obj1 = MyClass1()
obj2 = MyClass2()
print(obj1 + obj2) #这是_ add_ _+的结果
class MyClass1 (object):
pass
class MyClass2 (object) :
def __radd__ (self, other):
return "这是__radd__ +的结果"
obj1 = MyClass1()
obj2 = MyClass2()
print(obj1 + obj2) #这是__radd__ +的结果
七、_str_()和_repr_()用于自定义并返回实例对象的字符串表示形式
- 当在交互式命令行中直接打印一个实例对象时,如果在实例对象对应的类对象中实现了特殊方法_ repr__ (), 会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址。
- 当调用内置函数print打印一 个实例对象时,如果在实例对象对应的类对象中实现了特殊方法str__ (), 会自动调用该方法,否则,如果在实例对象对应的类对象中实现了特殊方法repr__ (), 会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址。
- 当调用内置函数str创建字符串并且实参是一个实例对象时,
如果在实例对象对应的类对象中实现了特殊方法__ str__ (), 在内置函数str的内部会自动调用该方法;否则,如果在实例对象对应的类对象中实现了特殊方法repr__ (), 在内置函数str的内部会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址 - 当调用内置函数repr创建字符串并且实参是一个实例对象时,如果在实例对象对应的类对象中实现了特殊方法_ repr__ (), 在内置函数repr的内部会自动调用该方法;否则,会打印实例对象对应的类对象和实例对象在内存中的地址。
- 通常情况下,类对象的特殊方法_ str__ ()和_ repr_ ()的实现代码是一样的,因此,当实现了其中一个后,可以把其方法名赋值给另一个的方法名。
- 内置函数str( )和repr ()都返回对象的字符串表示,其区别在于:
str()的返回值是给用户看的,更加用户友好;
repr()的返回值是给程序开发者看的,是为调试服务的。
classMyClass(object) :
def __str__(self) :
return "这是实例对象的字符串表示形式"
__repr __ = __ str__
str ("Hello, \nworld!") #'Hello, \nworld!'
repr("Hello, \nworld!") #"'Hello, \\nworld!'"