我正在尝试使用元类来实现以下功能:
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函数,然后才运行任何其他功能。
我该怎么做?或者我怎么能做得更好?
答案 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)})
有可能有更好的方法来完成你想要做的事情 - 但是这个应该做的伎俩。