复习1

#自省、反射

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__  对象加括号    就调用此方法

原文地址:https://www.cnblogs.com/ch2020/p/12454821.html