类型 | 名称 | 描述 |
---|---|---|
特殊属性 | __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__': , 'eat': , '__doc__': None}
print(x.__class__) # 输出对象所属的类;
print(Human.__bases__) # 输出父类类型的元组; (, )
print(Human.__base__) # 输出基类,第一个继承的父类;
print(Human.__mro__) # 类的层次结果;(, , , )
print(A.__subclasses__()) # 获取子类的列表;[, ]
__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初始化。