2011-04-26 73 views
2

定義的類的具體方法我有此示例代碼運行通過串

class aaa: 

    @staticmethod 
    def method(self): 
     pass 

    @staticmethod 
    def method2(self): 
     pass 

command = 'method' 

現在我想運行由命令串所定義的類AAA的方法。我怎麼能這樣做?非常感謝你。

+1

靜態方法不應該有一個'self' PA rameter。靜態方法不與任何類或實例屬性交互。 – Daenyth 2011-04-26 15:43:40

回答

3

首先,刪除staticmethod s的self參數 - staticmethod s的整點是它們沒有self參數。然後,使用

method = getattr(aaa, command) 
method() 

或者乾脆

getattr(aaa, command)() 

調用由command命名方法。

(我只是想知道你爲什麼不乾脆在首位使用command = aaa.method,但也有一定的應用場合,這是不可能的。)

1

可以使用getattr通過名字得到一個對象的屬性。

In [141]: class Foo(object): 
    .....:  def frob(self): 
    .....:   print "Frobbed" 
    .....:   
    .....:   

In [142]: f = Foo() 

In [143]: getattr(f, 'frob') 
Out[143]: <bound method Foo.frob of <__main__.Foo object at 0x2374350>> 

In [144]: _() 
Frobbed 
4

不要。這種方法引入的問題(安全性,清潔性,性能,可讀性等)很少有理由處理。只需使用command = aaa.method

如果使用字符串(希望一個很好的理由),你可以使用getattr但你propably應該使用顯式映射指定所有有效名稱(這也使得對內部代碼面向未來重命名/重構):

methods = { 
    'method': aaa.method, 
    'method2': aaa.method2, 
} 
methods[command]() 

案例「該字符串沒有方法」,可以這樣處理:

method = methods.get(command) 
if method is None: 
    ... # handle error/bail out