动态创建的类中的Python继承

时间:2012-09-13 22:27:16

标签: python metaclass monkeypatching

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

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函数,然后才运行任何其他功能。

我该怎么做?或者我怎么能做得更好?

2 个答案:

答案 0 :(得分:5)

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

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

def class_factory():
    class NewFoo(foo):
        def bar(self):
            foo.bar()
            print 'another world!'
    return NewFoo

答案 1 :(得分: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)})

有可能有更好的方法来完成你想要做的事情 - 但是这个应该做的伎俩。