質問

メタクラスを使用してクラスにインスタンス メソッドを追加するにはどうすればよいですか (はい、メタクラスを使用する必要があります)。次の種類は機能しますが、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'

これで自由に通行できます Foos を期待するライブラリへ Foo という名前のメソッドを持つインスタンス foobar.

残念ながら、(1) メタクラスの使用方法がわかりません、(2) あなたの質問を正しく読んだかわかりませんが、これが役立つことを願っています。

ご了承ください func_name は Python 2.4 以降でのみ割り当て可能です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top