2

我正在尝试使用元类来实现以下功能:

class foo( object ):

    def __init__( self ):
        self.val = 'foo'

    def bar( self ):
        print 'hello world'
        print self.val

f = foo()
f.bar() #prints 'hello world' followed by foo

def newbar( self ):
    super( **?**, self).bar()
    print 'another world!'

fooNew = type('fooNew', (foo,), {'bar':newbar})
n = fooNew()
n.bar() # should print everything in f.bar() followed by 'another world!'

我知道我可以使用猴子补丁来实现我自己的函数 newbar。但是有一个细微的区别,我希望新的 bar 函数首先运行基类 bar 函数,然后才运行任何附加功能。

我怎样才能做到这一点?或者我怎么能做得更好?

4

2 回答 2

5

使用super()调用基类方法在某些多重继承情况下具有优势,但在大多数其他情况下(即在 95% 的用例中)存在劣势。所以这里干脆不要使用super(),而是直接调用基类方法。

我会采用另一种方式(前提是我确定我真的想动态创建一个类)。您可以在函数中定义整个类并返回它:

def class_factory():
    class NewFoo(foo):
        def bar(self):
            foo.bar()
            print 'another world!'
    return NewFoo
于 2012-09-13T22:32:10.827 回答
3

您可以更改 的定义newbar以返回一个函数:

def newbar_factory(cls):
    def newbar(self):
        super(cls, self).bar()
        # Alternately, as Sven points out you could do
        # cls.bar(self)
        print "another world!"

    return newbar

# Use
fooNew = type('fooNew', (foo,), {'bar':newbar_factory(foo)})

可能有更好的方法来完成您正在尝试做的事情 - 但这应该可以解决问题。

于 2012-09-13T22:31:29.260 回答