‘’’’
class Person():
def init(self, name):
self.name = name
def getattribute(self, attr):
print("in getattribute")
return object.getattribute(self, attr)
# return super.getattribute(attr)
def getattr(self, attrname):
if attrname == "name":
print("in getattr1")
return self.name
elif attrname == "age":
print("in getattr2")
return 25
else:
print("in getattr3")
raise AttributeError(attrname)
p = Person("malongshuai")
print(p.name)
打印结果是空吧,object类没有name属性
‘’’’
“object” 这个名字在 Python 里同时指两样东西
① 一个类,名字叫 object,它是所有新式类的最终基类。
② 这类里有一个静态 C 函数(在 CPython 源码里叫 PyObject_GenericGetAttr),它通过 object.__getattribute__ 暴露给 Python。这个函数不是去 object 类里拿属性,而是 用一套固定的算法去“某个对象”里拿属性。
2. 调用 object.__getattribute__(some_obj, 'attr') 时
第一个参数 some_obj 才是真正要被查属性的对象;第二个参数是要找的属性名。算法大致如下(简化版):
◦ 先看 some_obj.__dict___ 里有没有 'attr'
◦ 没有再沿着 type(some_obj).mro 依次到各个类里找
◦ 还找不到就抛 AttributeError
因此,object.__getattribute__ 只是提供通用查找逻辑,并不会把自己限定在 object 这个类内部。
return object.__getattribute__(self, attr)
self 就是 Person 的实例 p,所以实际流程是:
◦ 在 p.__dict__ 里找 name → 找到 'malongshuai' → 直接返回
◦ 完全不会去看 object 类里有没有 name。
一句话总结:
object.__getattribute__ 不是“去 object 类里拿属性”,而是“用 object 提供的通用算法,到给定对象里拿属性”。