2013-11-14 64 views
3

這裏添加一個方法是簡化背景: 自動填充類列表時,我在子類中

class A(object): 
    def __init__(self): 
     self.vocab = [ 
      ('method1', self.method1), 
      ('method2', 'arg2', self.method2), 
      ('method3', self.method3), 
     ] 

class SubA(A): 
    def method4(self): 
     pass 
    def method5(self, arg5): 
     pass 

class SubB(A): 
    def method6(self): 
     pass 
    def method7(self): 
     pass 

我想「自動」填寫從A級的所有self.vocab名單方法從所有子類中按照self.vocab初始化中定義的規則進行。所以在這個例子中,我想在object是instanciate時自動添加method4,...,method7。 所以self.vocab變爲:

self.vocab = [ 
     ('method4', self.method4), 
     ('method5', 'arg5', self.method5), 
     ('method6', self.method6), 
     ('method7', self.method7), 
     ('method1', self.method1), 
     ('method2', 'arg2', self.method2), 
     ('method3', self.method3), 
    ] 

我想我需要更改成元類和使用__new__,而不是因爲我認爲它必須instanciation前完成。實際上,A類被另一個代碼所反省。 self.vocab是在實例化過程中提取的,這就是爲什麼我認爲它必須在之前完成的原因。

我不知道如何進行,如果可能的話。

回答

3

inspect module包含您需要的所有工具。

看到這個問題,如何獲得一個類的所有方法:How do I get list of methods in a Python class?

可以使用self.__class____init__自己當前類獲得。

+1

+1檢查模塊。我會看到更多的細節,我回來了。 – Katsu

+0

你終於提出了這個問題(在init中是'self .__ class__')。但事實上,檢查必須在導入模塊(類)之後和實例之前完成。但這是我以後會發表的另一個問題。 – Katsu

0

其實檢查包可以爲你做每件事。你可以使用它像這樣..

inspect.getmembers(mod, inspect.isfunction) # returns all the members of the given module which are functions 

但你可以改變謂詞如isfunction,isclass,ismethod的綁定方法等

希望這有助於:)

1

所以,這裏是我的解決方案我改變了一些初始設置,儘管我試圖保留原來的想法:

import inspect 


class A(object): 

    vocab = set() 

    def __new__(cls, *args, **kwargs): 
     A.vocab.update(inspect.getmembers(cls, inspect.ismethod)) 


class SubA(A): 

    def method4(self): 
     pass 

    def method5(self, arg5): 
     pass 


class SubB(A): 

    def method6(self): 
     pass 

    def method7(self): 
     pass 


print A.vocab # set([]) 
SubA() 
SubA() 
SubB() 
print A.vocab # set([('method5', <unbound method SubA.method5>), ('method6', <unbound method SubB.method6>), ('method4', <unbound method SubA.method4>), ('method7', <unbound method SubB.method7>)]) 
+0

當我嘗試用虛擬課堂時,它似乎工作。但是在這裏,我的類被另一個代碼內省了,如果我添加'__new__'方法,它會返回錯誤:'AttributeError:'NoneType'對象沒有屬性'vocab''。也許我必須用新方法返回一些東西?當然,我添加了具有所有功能的__init__方法。 – Katsu

+0

事實上,我必須在__new__方法的最後:'超級(A,CLS).__新__(CLS)'。但它與初始化之前和自我.__ class__作爲參考一樣(請參閱@Aaron Digulla) – Katsu