Python 面向对象反射及内置方法(部分)讲解
- 反射--自省
hasattr(obj, '属性') obj.属性 是否存在 getattr(obj, '属性') 获取 obj.属性 不存在则报错 getattr(obj, '属性' , '默认值') 获取 obj.属性 不存在 返回 默认值 setattr(obj, '属性') obj.属性 = 属性值 delattr(obj, '属性') del obj.属性
2. 内置方法- 属性的增删查
# __getattr__, __setattr__, __delattr__ 触发条件:obj点的 方式去操作属性时触发的方法
__getattr__: obj.属性 不存在时触发 __setattr__: 设置 obj.属性 时触发 __delattr__: del obj.属性 时触发
# __getitem__ , __setitem__ , __delitem__ 触发条件: obj[属性] 的方式去操作属性时触发的方法
__getitem__: obj[属性] 时触发 __setitem__: obj[属性] = 属性的值 时触发 __delitem__: del obj[属性] 时触发
3. 内置方法-描述符
# __get__ , __set__, __delete__
# 描述就是一个新式类,这个类至少要实现上述三个方法的一个。
# 在其它类中生成本类的对象,本类成为代理,别类的对象调用本类的对象变量时触发上述方法。
示例:
class Foo: def __init__(self, name): self.name = name def __get__(self, instance, owner): print('get方法') def __set__(self, instance, value): print('set方法') def __delete__(self, instance): print('delete方法') class Bar: x = Foo('name') def takepart(self): print(self.x) b1 = Bar() b1.x = 1 //触发Foo 中 __set__方法 print(b1.x) //触发Foo 中 __get__方法
注意:在被描述的类中,类可以直接修改/获取 描述符,但不会触发 描述符方法
# 优先级:类属性 -- 描述符属性 -- 示例属性
相关推荐
YENCSDN 2020-11-17
lsjweiyi 2020-11-17
houmenghu 2020-11-17
Erick 2020-11-17
HeyShHeyou 2020-11-17
以梦为马不负韶华 2020-10-20
lhtzbj 2020-11-17
夜斗不是神 2020-11-17
pythonjw 2020-11-17
dingwun 2020-11-16
lhxxhl 2020-11-16
坚持是一种品质 2020-11-16
染血白衣 2020-11-16
huavhuahua 2020-11-20
meylovezn 2020-11-20
逍遥友 2020-11-20
weiiron 2020-11-16