python魔术方法

魔法方法
#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__方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值