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。
我在 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。