|
发表于 2018-7-21 11:23:43
|
显示全部楼层
本帖最后由 Python_str 于 2018-7-21 11:27 编辑
@xue11>>> class C:
def __getattribute__(self,name):
print('getattribute')
return super().__getattribute__(name)
def __getattr__(self,name):
print('getattr')
>>> a = C()
>>> a.t
getattribute
getattr
>>>>>> hasattr(a,'t')
getattribute
getattr
True
#验证属性t 是否为父类object 的属性
>>> hasattr(object,'t')
False
这时t 已经是C 类的属性对吧,是因为重写了getattribute方法对吧,若没有重写则t 并不是C类的属性了,对吧。我在举个例子你看下
这么说是不对的哦
a.t 并不是给C类回或是实例对象a设置属性,就是一个访问或说调用('.'运算), a.t = 5这是赋值后才算数设置了属性,但只是给实例对象a设置了,只能给自己之用,你在实例化另一个对象是访问不了t的,你可以a.__dir__()查看a的所有属性和方法
hasattr为什么返回时True呢,是因为hasattr通过调用__getattr__根据是否抛出异常来判断属性是否存在的 默认基类里面是没有定义__getattr__这个魔法方法的, 你在C类中定义了,所以是不会有异常抛出的,除非你定义的语句有异常抛出, 而且要是AttributeError这种异常才可以哦 换句话说hasattr是用来处理AttributeError异常的,有异常处理就返回False 没有就返回True
|
|