What is the python attribute get and set order?

白昼怎懂夜的黑 提交于 2019-11-30 20:45:48

bar = a.foo...

  1. invokes a.__getattribute__('foo')
  2. which in turn by default looks up a.__dict__['foo']
  3. or invokes foo's .__get__() if defined on A.

The returned value would then be assigned to bar.


a.foo = bar...

  1. invokes a.__getattribute__('foo')
  2. which in turn by default looks up a.__dict__['foo']
  3. or invokes foo's .__set__(bar) if defined on A.
cizixs

I found out this great post that has a detailed explanation on object/class attribute lookup.

For object attribute lookup:

Assuming Class is the class and instance is an instance of Class, evaluating instance.foobar roughly equates to this:

  • Call the type slot for Class.__getattribute__ (tp_getattro). The default does this:
    • Does Class.__dict__ have a foobar item that is a data descriptor ?
      • If yes, return the result of Class.__dict__['foobar'].__get__(instance, Class).
    • Does instance.__dict__ have a 'foobar' item in it?
      • If yes, return instance.__dict__['foobar'].
    • Does Class.__dict__ have a foobar item that is not a data descriptor [9]?
      • If yes, return the result of Class.__dict__['foobar'].__get__(instance, klass). [6]
  • If the attribute still wasn't found, and there's a Class.__getattr__, call Class.__getattr__('foobar').

There is an illustrated image for this:

Please do check out the original blog if interested which gives a outstanding explanation on python class, attribute lookup, and metaclass.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!