python - Python 中 getattribute 背后的确切原理是什么?

标签 python

我尝试运行下面来自 python reference 的示例代码.

>>> class Meta(type):
...    def __getattribute__(*args):
...       print "Metaclass getattribute invoked"
...       return type.__getattribute__(*args)
...
>>> class C(object):
...     __metaclass__ = Meta
...     def __len__(self):
...         return 10
...     def __getattribute__(*args):
...         print "Class getattribute invoked"
...         return object.__getattribute__(*args)

然后我测试了下面的代码:

In [16]: c = C()
class getattribute invoked
class getattribute invoked

In [17]: c
Class getattribute invoked
Class getattribute invoked
Out[17]: Class getattribute invoked
Metaclass getattribute invoked
Metaclass getattribute invoked
Metaclass getattribute invoked
Metaclass getattribute invoked
Metaclass getattribute invoked
Class getattribute invoked
Metaclass getattribute invoked
Metaclass getattribute invoked
Metaclass getattribute invoked
Metaclass getattribute invoked
<__main__.C at 0x29448d0>

任何人都可以对输出有一个明确的解释吗?我看到显示了很多“Metaclass getattribute invoked”,这意味着 __getattribute__() 被调用了很多次。

最佳答案

我也是这样做的。除了打印参数:

In [2]: class Meta(type):
   ...:     def __getattribute__(*args):
   ...:         print args
   ...:         return type.__getattribute__(*args)
   ...:     

In [3]: class C(object):
   ...:     __metaclass__ = Meta
   ...:     def __len__(self):
   ...:         return 10
   ...:     def __getattribute__(*args):
   ...:         print args
   ...:         return object.__getattribute__(*args)

得到这个结果:

In [8]: c
(<__main__.C object at 0x104aeff10>, '__class__')
(<__main__.C object at 0x104aeff10>, '__class__')
Out[8]: (<__main__.C object at 0x104aeff10>, '__class__')
(<class '__main__.C'>, '__mro__')
(<class '__main__.C'>, '__mro__')
(<class '__main__.C'>, '__module__')
(<class '__main__.C'>, '__name__')
(<class '__main__.C'>, '__dict__')
(<__main__.C object at 0x104aeff10>, '__class__')
(<class '__main__.C'>, '__repr__')
(<class '__main__.C'>, '__class__')
(<class '__main__.C'>, '__module__')
(<class '__main__.C'>, '__name__')
<__main__.C at 0x104aeff10>

非常不言自明。第一个参数是对象,第二个是调用的属性。

关于python - Python 中 getattribute 背后的确切原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19018902/

相关文章:

python - 获取字典中相似值的键的最有效方法

python - 匹配 python 数据集中的多个项目

python - 如何解决 "TypeError: string indices must be integers"错误?

python - 何时使用 MySQLdb 关闭游标

python - 无法在机器人框架中添加httplibrary

python - 如何点击带有图像的onclick链接? Python Selenium

python - 从聚合类别创建新列

python - Pandas 是否可以在具有时间序列的 csv 列中添加带有空值的新时间值?

python - 编写excel文件,Python中的.xlsx格式

python - Django 基于可选参数的过滤