首页 新闻 会员 周边 捐助

object类没有name属性,为啥原始实现会按顺序: ◦ 在类及其实例字典里找 'name' ◦ 找到了,于是返回 'malongshuai'

0
[已关闭问题] 关闭于 2025-08-17 07:41

‘’’’
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属性
‘’’’

_java_python的主页 _java_python | 小虾三级 | 园豆:938
提问于:2025-08-17 07:40
< >
分享
所有回答(1)
0

“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 提供的通用算法,到给定对象里拿属性”。

_java_python | 园豆:938 (小虾三级) | 2025-08-17 07:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册