名称 | 描述 | |
特殊属性 | __dict__ | 获得类对象/实例对象所绑定的所有属性和方法的字典 |
__class__ | 输出对象所属的类 | |
__bases__ | 输出类所属的父类 | |
__mro__ | 查看类的层次结构 | |
__subclasses__ | 查看类的子类 | |
特殊方法 | __len__() | 重写此方法,可以让内置函数len()的参数是自定义类型 |
__add__() | 重写此方法,可以使用自定义对象具有+的功能 | |
__new__() | 用于创建对象 | |
__init__() | 对创建对象初始化 |
__dict__属性
class A:
pass
class B:
pass
class C(A,B):
def __init__(self,name):
self.name=name
"""实例对象用dict方法,得到绑定属性与对应属性值的字典"""
x=C('Alice')
print(x.__dict__)
"""类对象用dict方法,得到属性与方法的字典"""
print(C.__dict__)
结果得到一个键为绑定属性,值为对应属性值的字典
{'name': 'Alice'}
{'__module__': '__main__', '__init__': <function C.__init__ at 0x000000C6E4D55000>, '__doc__': None}
__class__属性
"""指向实例对象所属的类"""
print(x.__class__)
"""对类使用此函数会显示类的类型"""
print(C.__class__)
"""可以进行套用"""
print(x.__class__.__class__)
结果如下:
<class '__main__.C'>
<class 'type'>
<class 'type'>
__bases__/__base__
print(C.__bases__)
"""结果为(<class '__main__.A'>, <class '__main__.B'>)"""
print(C.__base__)
"""结果为(<class '__main__.A'>"""
__mro__ and __subclasses__
"""查看类的层级关系,不清楚类之间关系时可以使用这个属性"""
print(C.__mro__)
"""(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)"""
"""查看类的子类,使用复数以防多个子类"""
print(A.__subclasses__())
"""(<class '__main__.C'>"""
特殊方法
__len__()
比如创建一个实例对象,如果想要得到这个实例对象实例属性的长度,会报错,如图:
class C():
def __init__(self,name):
self.name=name
x=C('Alice')
print(len((x))
"""结果为:TypeError: object of type 'C' has no len()"""
如果想要实现这个功能,需要改写方法
class C():
def __init__(self,name):
self.name=name
"""改写len()方法"""
def __len__(self):
return len(self.name)
x=C('Alice')
print(len((x))
"""结果为:5"""
__add__()
一般情况下,我们想让两个实例对象字符串的部分相加,会报错
class C():
def __init__(self,name,age):
self.name=name
self.age=age
a=C('lily',20)
b=C('Jim',23)
c=a+b
print(c)
"""报错,TypeError: unsupported operand type(s) for +: 'C' and 'C'"""
如果想要实现这一功能,我们需要在类里进行改写__add__方法
class C():
def __init__(self,name,age):
self.name=name
self.age=age
"""重写__add__方法"""
def __add__(self, other):
return self.name+other.name
a=C('lily',20)
b=C('Jim',23)
c=a+b
print(c)
"""结果为:lilyJim"""
__new__方法和__init__方法的区别,有一篇文章讲的好清楚,留存