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方法变成属性赋值

浙公网安备 33010602011771号