如何使用元类向类中添加实例方法(是的,我需要使用元类)?以下类型的工作,但func_name仍将是“foo”:
def bar(self):
print "bar"
class MetaFoo(type):
def __new__(cls, name, bases, dict):
dict["foobar"] = bar
return type(name, bases, dict)
class Foo(object):
__metaclass__ = MetaFoo
>>> f = Foo()
>>> f.foobar()
bar
>>> f.foobar.func_name
'bar'
我的问题是某些库代码实际上使用了func_name,后来无法找到Foo实例的'bar'方法。我能做到:
dict["foobar"] = types.FunctionType(bar.func_code, {}, "foobar")
还有types.MethodType,但我需要一个尚未使用的实例。我在这里错过了吗?
答案 0 :(得分:15)
尝试动态扩展基础,以便您可以利用mro,方法是实际方法:
class Parent(object):
def bar(self):
print "bar"
class MetaFoo(type):
def __new__(cls, name, bases, dict):
return type(name, (Parent,) + bases, dict)
class Foo(object):
__metaclass__ = MetaFoo
if __name__ == "__main__":
f = Foo()
f.bar()
print f.bar.func_name
答案 1 :(得分:2)
我认为你想要做的是:
>>> class Foo():
... def __init__(self, x):
... self.x = x
...
>>> def bar(self):
... print 'bar:', self.x
...
>>> bar.func_name = 'foobar'
>>> Foo.foobar = bar
>>> f = Foo(12)
>>> f.foobar()
bar: 12
>>> f.foobar.func_name
'foobar'
现在,您可以将Foo
传递给期望Foo
个实例拥有名为foobar
的方法的库。
不幸的是,(1)我不知道如何使用元类和(2)我不确定我是否正确地阅读了你的问题,但我希望这会有所帮助。
请注意,func_name
只能在Python 2.4及更高版本中分配。