2008-09-15 52 views
8

添加方法如何添加一個實例方法使用元類類(是的,我確實需要使用元類)?下面這類作品,但FUNC_NAME仍將是「富」:如何使用元類

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後來未能找到富實例的「棒」的方法。我可以這樣做:

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

還有types.MethodType,但我需要一個實例,還沒有存在使用它。我在這裏錯過了些什麼?

+0

你爲什麼要試圖改變方法的名字嗎?不會dict [bar.func_name] = bar完成你想要的嗎? – 2008-09-15 19:03:13

+0

好問題...我最初是根據字典中定義的屬性創建方法名稱,但是如果這些方法的實現是相同的,我意識到這是毫無意義的。 – 2008-09-15 19:30:18

回答

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 
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 s到一個期望Foo實例有一個名爲foobar方法庫。

不幸的是,(1)我不知道如何使用元類和(2)我不知道我正確地讀你的問題,但我希望這會有所幫助。

注意func_name只有在Python 2.4和更高的分配。