魔法方法
#init:在类的实例化会触发
def init(self, name):
self.name = name
#str:打印对象触发
默认打印默认打印:<main.Person object at 0x7fb7d5f596a0>
def str(self):
return ‘I am {}’.format(self.name)#该方法必须返回字符串类型
#call:对象()是触发,类的实例化就是(类())就是调用元类的__call__方法
class Person:
def init(self):
# self.name = name
print(‘init’)
def call(self, *args, **kwargs):
print(‘call’)
p = Person() # init
p() # call
#new:在类是实例化时触发,比__init__更早
#del:会在对象被删除时自动触发。由于Python自带的垃圾回收机制会自动清理Python程序的资源,所以当一个对象只占用应用程序级资源时,完全没必要为对象定制__del__方法,但在产生一个对象的同时涉及到申请系统资源(比如系统打开的文件、网络连接等)的情况下,关于系统资源的回收,Python的垃圾回收机制便派不上用场了,需要我们为对象定制该方法,用来在对象被删除时自动触发回收系统资源的操作,比如连接数据库
#setattr,getattr😦.拦截方法)
class People:
def init(self, name, age):
self.name = name
self.age = age
def getattr(self, item):
print(‘getattr-{}’.format(item))
p = People(‘aa’, 19)
p.sex#__getattr__只会在对象.属性且属性不存在时才会触发
def setattr(self, key, value):
self.dict[key] = value print(‘setattr:{}+{}’.format(key, value))#添加、修改属性的时候触发,如果没有self.dict[key] = value这条语句的话,无法赋值成功,因为重写了__setattr__方法,除非直接使用__dict__赋值
#setitem,getitem([]拦截)
class People:
def init(self, name, age):
self.name = name
self.age = age
def setitem(self, key, value):
self.dict[key]=value
p = People(‘bb’,19)
p[‘age’]=13
print(p.age)
#enter,exit
上下文管理器,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法