作者:刘缙
链接:https://www.zhihu.com/question/25391709/answer/30634637
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
defobject_getattr(obj, name):'Look for attribute /name/ in object /obj/.'# First look in class and base classes.
v, cls = class_lookup(obj.__class__, name)
if (v isnotNone) and hasattr(v, '__get__') and hasattr(v, '__set__'):
# Data descriptor. Overrides instance member.return v.__get__(obj, cls)
w = obj.__dict__.get(name)
if w isnotNone:
# Found in objectreturn w
if v isnotNone:
if hasattr(v, '__get__'):
# Function-like descriptor.return v.__get__(obj, cls)
else:
# Normal data member in classreturn v
raise AttributeError(obj.__class__, name)
defclass_lookup(cls, name):'Look for attribute /name/ in class /cls/ and bases.'
v = cls.__dict__.get(name)
if v isnotNone:
# found in this class return v, cls
# search in base classes for i in cls.__bases__:
v, c = class_lookup(i, name)
if v isnotNone:
return v, c
# not found returnNone
经常看到有人说obj.key = val 等价于obj.__dict__[key] = val,其实根据我们上面的那个搜索顺序,在有descriptor的情况下,会不太一样。