类型 | 名称 | 形容 |
---|---|---|
非凡属性 | __dict__ | 获取类对象所有属性和办法或获取实例对象所有属性的字典 |
__class__ | 获取实例对象的类 | |
__bases__ | 输入父类类型的元组 | |
__base__ | 输入基类,第一个继承的父类 | |
__mro__ | 类的档次后果 | |
非凡办法 | __len__() | 重写此办法,让内置函数len()的参数能够是自定义类型 |
__add__() | 重写此办法,可应用自定义对象具备“+”性能 | |
__new__() | 创建对象 | |
__init__() | 对创立的对象进行初始化 | |
__subclasses__() | 获取子类的列表 |
代码示例:
class A: passclass B: passclass C(A): passclass Human(A, B): def __init__(self, name, age): self.name = name self.age = age def eat(self): print('人吃各种')x = Human('a', 22)print(x.__dict__) # 实例对象的属性字典;{'name': 'a', 'age': 22}print(Human.__dict__) # 类对象的属性和办法字典;{'__module__': '__main__', '__init__': <function Human.__init__ at 0x0000022F9EF6FEE0>, 'eat': <function Human.eat at 0x0000022F9EF6FF70>, '__doc__': None}print(x.__class__) # 输入对象所属的类;<class '__main__.Human'>print(Human.__bases__) # 输入父类类型的元组; (<class '__main__.A'>, <class '__main__.B'>)print(Human.__base__) # 输入基类,第一个继承的父类;<class '__main__.A'>print(Human.__mro__) # 类的档次后果;(<class '__main__.Human'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)print(A.__subclasses__()) # 获取子类的列表;[<class '__main__.C'>, <class '__main__.Human'>]
__add__()
代替 +
:
a = 1b = 2c = a + bd = a.__add__(b)print(c, d) # 3 3
自定义类型的相加,必须重写__add__()
:
class Student: def __init__(self, name): self.name = name def __add__(self, other): return self.name + other.namestu1 = Student('张三')stu2 = Student('历史')s = stu1 + stu2print(s) # 张三历史# 不重写时,抛出TypeError: unsupported operand type(s) for +: 'Student' and 'Student'
重写__len__()
办法,自定义__len__()
的参数及返回内容:
class Student: def __init__(self, name): self.name = name def __len__(self): return self.name # return len(self.name)stu1 = Student('张三')lst = [1, 2, 3]print(lst.__len__()) # 3print(stu1.__len__()) # 张三# 不重写时,抛出AttributeError: 'Student' object has no attribute '__len__'
__init__()
和__new__()
的执行程序:
class Person: def __init__(self, name, age): print('执行了__init__(),self的id:', id(self)) self.name = name self.age = age def __new__(cls, *args, **kwargs): print('执行了__new__(),cls的id:', id(cls)) object1 = super().__new__(cls) print('创建对象的id:', id(object1)) return object1print('object类对象的id:', id(object))print('Person类对象的id:', id(Person))p1 = Person('张三', 22) # 先执行“=”右侧的代码,再进行赋值print('p1实例对象的id:', id(p1))
输入后果:
object类对象的id: 140722564381520
Person类对象的id: 1296646616816
执行了__new__(),cls的id: 1296646616816
创建对象的id: 1296654563888
执行了__init__(),self的id: 1296654563888
p1实例对象的id: 1296654563888
论断:先创建对象,再init初始化。