- 反射--自省
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__方法
注意:在被描述的类中,类可以直接修改/获取 描述符,但不会触发 描述符方法
# 优先级:类属性 -- 描述符属性 -- 示例属性