魔法方法
一、__init__
构造函数,可以理解为初始化
触发条件:在实例化的时候就会触发
class People():
def __init__(self, name):
print('init被执行')
self.name = name
def 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 = length
self.width = width
def __add__(self, other):
l = self.length + other.length
w = 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 = name
def __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 = name
self.age = 18
a = People('张三')
print(a.__dict__) # {'name': '张三', 'age': 18}
二、__class__
查看类型
class People():
pass
a = People()
print(a.__class__) # <class '__main__.People'>
三、__doc__
查看对象信息
class People():
"""
这个类是 People
"""
a = People()
print(a.__doc__)
# 这个类是 People
四、__bases__
查看父类
class People():
pass
print(People.__bases__) # (<class 'object'>,)
五、__mro__
查看继承顺序
class People():
pass
print(People.__mro__) # (<class '__main__.People'>, <class 'object'>)
其他魔法方法
当然,除了以上所说的魔法方法,还有一些其他魔法方法的