質問
メタクラスを使用してクラスにインスタンス メソッドを追加するにはどうすればよいですか (はい、メタクラスを使用する必要があります)。次の種類は機能しますが、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 もありますが、それを使用するにはまだ存在しないインスタンスが必要です。ここで何かが足りないのでしょうか?
解決
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
他のヒント
あなたがやりたいことはこれだと思います:
>>> 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
s を期待するライブラリへ Foo
という名前のメソッドを持つインスタンス foobar
.
残念ながら、(1) メタクラスの使用方法がわかりません、(2) あなたの質問を正しく読んだかわかりませんが、これが役立つことを願っています。
ご了承ください func_name
は Python 2.4 以降でのみ割り当て可能です。
所属していません StackOverflow