Python 面向对象反射及内置方法(部分)讲解

  1. 反射--自省
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__方法

注意:在被描述的类中,类可以直接修改/获取 描述符,但不会触发 描述符方法

# 优先级:类属性 -- 描述符属性 -- 示例属性

Python 面向对象反射及内置方法(部分)讲解

相关推荐