理解python super()get_attribute()

时间:2017-06-03 21:34:04

标签: python super getattribute

有人可以帮忙解释一下这段代码的行为吗?特别是,我对<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__

返回相同的输出。

1 个答案:

答案 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()逻辑。