python-attr和item系列属性
一、概述
__getattr__、__setattr__、__delattr__和__getitem__、__setitem__、__delitem__都是对属性的操作.触发条件相同,方式不同。
二、attr系列方法
class Foo: x = 1 def __init__(self, y): self.y = y def __getattr__(self, item): print("执行了__getatrr__") def __setattr__(self, key, value): print("执行__setattr__") # self.key = value # 会死递归。循环触发__setatt__ self.__dict__[key] = value def __delattr__(self, item): print("执行__delattr__") self.__dict__.pop(item) f = Foo(10) f.g # 当没有找到属性时,就触发执行__getattr__ f.z = 2 # 当新增、修改属性时,触发执行__setattr__ print("新增z属性后:", f.__dict__) del f.z print("删除z属性后:", f.__dict__) # 当删除属性时,触发执行__delattr__
运行结果
执行__setattr__ 执行了__getatrr__ 执行__setattr__ 新增z属性后: {'y': 10, 'z': 2} 执行__delattr__ 删除z属性后: {'y': 10}
三、item系列方法
class Foo: def __init__(self,name): self.name = name def __getitem__(self, item): print("执行__getitem__") return self.__dict__[item] def __setitem__(self, key, value): print("执行__setitem__") self.__dict__[key] = value def __delitem__(self, key): print("执行__delitem__") self.__dict__.pop(key) # 实例化Foo f = Foo("狗不理") print(f.__dict__) f["name"] # 通过字典[]方式获取属性,触发__getitem__ f["age"] = 100 #通过字典[]方式新增、修改属性,触发__setitem__ print(f.__dict__) del f["age"] print(f.__dict__) # 通过字典[]方式删除属性,触发__delitem__
运行结果
{'name': '狗不理'}
执行__getitem__
执行__setitem__
{'name': '狗不理', 'age': 100}
执行__delitem__
{'name': '狗不理'}
浙公网安备 33010602011771号