首页 > 编程语言 > 详细

python魔术方法

时间:2021-05-16 14:26:26      阅读:25      评论:0      收藏:0      [点我收藏+]

魔法方法

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

 

python魔术方法

原文:https://www.cnblogs.com/hysc/p/14773683.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!