有人可以帮忙解释一下这段代码的行为吗?特别是,我对<div id="navbar">
<div class="logo">
<img src="http://placehold.it/90x90/fb4" alt="" width="90px" height="90px">
</div>
<div class="navitems">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#team">Contact Us</a></li>
<li><a href="#about">About</a></li>
</ul>
</div>
</div>
上定义的__getattribute__()
函数的行为感到困惑。
我认为当我致电class D
时,d.foo()
中定义的__getattribute__()
会被调用。在该函数中,我们运行此class D
语句。 try
尝试运行try
。如果我理解正确,x = super(D, self).__getattribute__(item)
引用item
,我的困惑在于:
我认为'foo'
会返回super(D, self)
!但是,如果你看看class C
是什么,当我打印出来时,结果证明是x
。有人可以解释一下吗?
<bound method D.foo of <__main__.D object at 0x107d299d0>>
返回:
class A(object):
def foo(self):
print 'A'
class B(A):
def foo(self):
print 'B'
super(B, self).foo()
class C(A):
def foo(self):
print 'C'
super(C, self).foo()
class D(B,C):
def foo(self):
print 'D'
super(D, self).foo()
def __getattribute__(self, item):
try:
x = super(D, self).__getattribute__(item)
except AttributeError:
print 'Attribute Error'
else:
print x
return x
d = D()
d.foo()
早期版本的问题......
特别是,我对D类中<bound method D.foo of <__main__.D object at 0x107d299d0>>
D
B
C
A
方法的行为感到困惑。
当我致电__getattribute__
时,为什么会返回
x = super(D, self).__getattribute__(item)
我认为通过调用<bound method D.foo of <__main__.D object at 0x107d299d0>>
,我将获得B类,然后是C.
即使我将super(D, self)
置于C类之下,也是如此
__getattribute__
返回相同的输出。
答案 0 :(得分:0)
有人可以帮忙解释一下这段代码的行为吗?
特别是,我对D类中getattribute方法的行为感到困惑。
当我致电
x = super(D, self).getattribute(item)
时,为什么会返回<bound method D.foo of <__main__.D object at 0x107d299d0>>
目前还不完全清楚你的困惑来源是什么。我假设你期望获得C.foo()
,而不是D.foo()
。我想你要做的是:
def __getattribute__(self, item):
return getattr(super(D, self), item)
如果我理解正确,并且我在这个主题上远离古鲁,那么在__getattribute__
逻辑之前调用super
逻辑,因此你对get_attribute的使用不符合你的期望,因为没有调用super()
逻辑。