类型名称形容
非凡属性__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初始化。