魔法方法
一、__init__
构造函数,可以理解为初始化
触发条件:在实例化的时候就会触发
class People():def __init__(self, name):print('init被执行')self.name = namedef eat(self):print(f'{self.name}要吃饭')a = People('张三')
a.eat() # init被执行 张三要吃饭b = People('李四')
b.eat() # init被执行 李四要吃饭
二、__del__
析构函数,回收内存空间,也可以理解为释放内存空间
触发条件:del
class People():def __del__(self):print('del被执行')a = People()
del a # del被执行
三、__add__
触发条件:x+y
class jisuan():def __init__(self, length, width):self.length = lengthself.width = widthdef __add__(self, other):l = self.length + other.lengthw = self.width + other.width # 不管怎么变动,self接收前面一个,other接收后面一个print(l)print(w)x = jisuan(1, 2)
y = jisuan(3, 4)
x+y # 触发后 4 6
四、 __call__
实例化后,像函数一样调用
触发条件:实例化()
class People():def __call__(self):print('call被执行')a = People()
a() # call被执行
五、__str__ , __repr__
- __str__触发条件:print打印实例化对象变量时触发,在非交互式模式下,如果二者同时存在那么触发str
- __repr__触发条件:print打印实例化对象变量时触发,在交互式模式下,如果二者同时存在,如果不使用print,那么触发repr
非交互式环境下
class People():def __str__(self):return 'str被执行'def __repr__(self):return 'repr被执行'a = People()
print(a) # 输出 str被执行
交互式环境下
六、__new__
创建实例对象,在__init__的前面,更早触发
cls:类本身
object:超类,可以理解为所有类的祖先
class People():def __init__(self, name):print('init被触发')self.name = namedef __new__(cls, *args, **kwargs):print('new被触发')return object.__new__(cls) # 通过object.__new__创建cls(这个cls也就是等于People这个类)的实例对象a = People('张三')
print(a.name)# new被触发
# init被触发
# 张三
类的其他方法
一、__dict__
查看全部属性
class People():sex = '男'def __init__(self, name):self.name = nameself.age = 18a = People('张三')
print(a.__dict__) # {'name': '张三', 'age': 18}
二、__class__
查看类型
class People():passa = People()
print(a.__class__) # <class '__main__.People'>
三、__doc__
查看对象信息
class People():"""这个类是 People"""a = People()
print(a.__doc__)# 这个类是 People
四、__bases__
查看父类
class People():passprint(People.__bases__) # (<class 'object'>,)
五、__mro__
查看继承顺序
class People():passprint(People.__mro__) # (<class '__main__.People'>, <class 'object'>)
其他魔法方法
当然,除了以上所说的魔法方法,还有一些其他魔法方法的