类型 | 名称 | 形容 |
---|---|---|
非凡属性 | __dict__ |
获取类对象所有属性和办法或获取实例对象所有属性的字典 |
__class__ |
获取实例对象的类 | |
__bases__ |
输入父类类型的元组 | |
__base__ |
输入基类,第一个继承的父类 | |
__mro__ |
类的档次后果 | |
非凡办法 | __len__() |
重写此办法,让内置函数 len()的参数能够是自定义类型 |
__add__() |
重写此办法,可应用自定义对象具备“+”性能 | |
__new__() |
创建对象 | |
__init__() |
对创立的对象进行初始化 | |
__subclasses__() |
获取子类的列表 |
代码示例:
class A:
pass
class B:
pass
class C(A):
pass
class 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 = 1
b = 2
c = a + b
d = 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.name
stu1 = Student('张三')
stu2 = Student('历史')
s = stu1 + stu2
print(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__()) # 3
print(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 object1
print('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 初始化。