Bir metaclass kullanarak bir sınıf için bir örnek yöntemini nasıl ekleyebilirim (evet metaclass kullanmam gerekir)?Metaclass yöntemini kullanarak yöntem ekleme
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'
Sorunum bazı kütüphane kod aslında Foo örneğinin 'bar' yöntemi bulmak için başarısız sonra FUNC_NAME kullanır ve olmasıdır: çalışmaların şu tür ama FUNC_NAME hala "foo" olacaktır. Ayrıca types.MethodType vardır
dict["foobar"] = types.FunctionType(bar.func_code, {}, "foobar")
ama does'nt bu kullanmak için henüz var bir örneğini gerekir: Ben yapabilirdi. Burada birşeyleri kaçırıyor muyum?
>>> 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'
Şimdi
foobar
adında bir yöntemi olması
Foo
örneklerini bekleyen bir kütüphaneye
Foo
s geçmek serbesttir:
Neden yöntemin adını değiştirmeye çalışıyorsunuz? dict [bar.func_name] = bar istediğini yerine getirmiyor mu? –
İyi soru ... Özünde, dict'ta tanımlanan özniteliklere dayanarak yöntem adları oluşturuyordum, ancak yöntemlerin uygulamaları özdeşse bunun anlamsız olduğunu anlıyorum. –