python __getattribute__ 是不是在访问实例时调用?

python __getattribute__ is not called when visiting an instance?

我在 python 命令行下得到了以下代码。我希望当我访问一个属性时, getattribute 会被自动调用。但是我没有看到结果

class D:
  def __getattribute__(s,*a,**ka):
    print "__getattribute__"
    return object.__getattribute__(s,*a,**ka)

  def __getattr__(s,name):
    print "__getattr__"
    return name

  def __get__(s,instance,owner):
    print "__get__"
    return s
  a='abc'

class C2(object):
    d=D()

>>> d=D()
>>> c2=C2()
>>> print d.a
abc
>>> print d.zzz
__getattr__

没有打印“getattribute”。为什么?

将 class D 更改为新样式 class D(object):

class D(object):
  def __getattribute__(s,*a,**ka):
    print "__getattribute__"
    return object.__getattribute__(s,*a,**ka)

  def __getattr__(s,name):
    print "__getattr__"
    return name

  def __get__(s,instance,owner):
    print "__get__"
    return s

你是 运行ning Python 2,你的 D class 是旧式的,不是新式的。 __getattribute__ is used for new-style classes only.

通常,我将以下内容放在所有可能 运行 下的模块的顶部 Python 2,以确保所有 class 定义的都是隐含的新样式(并且不会对 Py3 造成伤害,它被忽略):

__metaclass__ = type

或者,您可以显式继承 object(或任何其他符合您需要的新样式 class)以获得新样式 classes。