#自省、反射
hasattr(obj,'属性') # 判断obj.属性是否存在
getattr(obj,'属性') 获取obj.属性 不存在则报错
getattr(obj,'属性','默认值') 获取obj.属性的值,不存在则返回默认值
setattr(obj,'属性','属性的值') 设置属性obj.属性=属性值
delattr(obj,'属性') 删除obj.属性
# __getattr__、__setattr__、__delattr__ 这几个和上面的没有任何关系,这几个是当寻找属性、设置和删除属性时才会触发。
__getattr__ 当obj.属性 不存在时触发
__setattr__ 当设置obj.属性时 会触发
__delattr__ 当删除obj.属性时 会触发
# __getitem__、__setitem__、__delitem__
__getitem__ obj['key'] 获取时触发
__setitem__ obj[key] = value 时触发
__delitem__ del obj[key] 时触发
# __get__、__set__、__delete__描述符
描述符就是一个新式类,这个新式类至少要实现上述三个方法中的一个
1 class 描述符: 2 def __get__(self, instance, owner): 3 pass 4 def __set__(self, instance, value): 5 pass 6 def __delete__(self, instance): 7 pass 8 class 类: 9 name = 描述符() 10 11 obj = 类() 12 obj.name # 触发描述符 get方法 13 obj.name = 'egon ' # 触发set方法 14 del obj.name # 触发delete方法
# __del__ 析构方法
垃圾回收后会触发此方法
# __getattribute__ 调用类属性时才会触发
不管属性存在与否都会触发
只有当在__getattribute__ 抛出Attriibute异常时,才会触发__getattr__ 方法
# __str__ 方法 可以显示打印对象(实例),可以自定义信息
1 class Foo: 2 def __str__(self): 3 return '这是析构函数的__str__方法' 4 def __repr__(self): 5 return '这是析构函数的__repr__方法' 6 7 f = Foo() 8 print(f) 9 输出: 10 这是析构函数的__str__方法
# __call__ 对象加括号 就调用此方法