python魔法方法和装饰器学习笔记

控制属性访问

1. __getattr__(self, name):  定义当用户试图获取一个不存在的属性是的行为;

2. __setattr__(self, name): 在对属性赋值时调用,是一个封装的解决方案,无论属性是否存在, 它都允许你定义对属性的赋值行为;实现__setattr__时要避免"无限递归"的错误

 

#  错误用法 
def __setattr__(self, name, value): 
    self.name = value 
    # 每当属性被赋值的时候(如self.name = value), ``__setattr__()`` 会被调用,这样就造成了递归调用。 
    # 这意味这会调用 ``self.__setattr__('name', value)`` ,每次方法会调用自己。这样会造成程序崩溃。 
#  正确用法 
def __setattr__(self, name, value): 
    self.__dict__[name] = value  # 给类中的属性名分配值 
    # 定制特有属性

  

3. __delattr__: 删除一个属性时调用,同样实现时也要防止无限递归;

4. __getattribute__(self, name):  定义了你的属性被访问时的行为,相比较,__getattr__只有该属性不存在时才会起作用;

   需要提醒最好不要尝试去实现__getattribute__,很容易出现bug

 

@property与@方法名.setter

Python内置的@property装饰器就是负责把一个方法变成属性调用;所以把一个getter方法变成属性,只需要加上@property,

@property本身又创建了另一个装饰器@mehod.setter,负责把一个setter方法变成属性赋值

 

posted @ 2021-04-16 15:52  向技术致敬  阅读(145)  评论(0)    收藏  举报