Frage

Wie kann ich eine Instanz Methode zu einer Klasse einer Metaklasse mit (ja, ich brauche eine Metaklasse zu verwenden)? Die folgende Art von Arbeiten, aber die func_name noch „foo“ sein:

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'

Mein Problem ist, dass einige Bibliothek Code tatsächlich die func_name verwendet und später nicht die ‚Bar‘ Methode der Foo-Instanz zu finden. Ich konnte tun:

dict["foobar"] = types.FunctionType(bar.func_code, {}, "foobar")

Es gibt auch types.MethodType, aber ich brauche eine Instanz, die noch existiert does'nt, dass zu verwenden. Fehle ich some hier?

War es hilfreich?

Lösung

Versuchen Sie erstreckt dynamisch die Basen, die Art und Weise Sie die Vorteile der MRO und die Methoden sind tatsächlich Methoden erfolgen:

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

Andere Tipps

Ich denke, was Sie wollen, dies zu tun ist:

>>> 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'

Jetzt sind Sie frei Foos in eine Bibliothek zu übergeben, die Instanzen haben eine Methode namens Foo.

foobar erwartet

Leider (1) Ich weiß nicht, wie metaclasses zu verwenden und (2) Ich bin mir nicht sicher, ob ich Ihre Frage richtig gelesen, aber ich hoffe, das hilft.

Beachten Sie, dass func_name nur belegbar ist in Python 2.4 und höher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top