定義的類的具體方法我有此示例代碼運行通過串
class aaa:
@staticmethod
def method(self):
pass
@staticmethod
def method2(self):
pass
command = 'method'
現在我想運行由命令串所定義的類AAA的方法。我怎麼能這樣做?非常感謝你。
定義的類的具體方法我有此示例代碼運行通過串
class aaa:
@staticmethod
def method(self):
pass
@staticmethod
def method2(self):
pass
command = 'method'
現在我想運行由命令串所定義的類AAA的方法。我怎麼能這樣做?非常感謝你。
首先,刪除staticmethod
s的self
參數 - staticmethod
s的整點是它們沒有self
參數。然後,使用
method = getattr(aaa, command)
method()
或者乾脆
getattr(aaa, command)()
調用由command
命名方法。
(我只是想知道你爲什麼不乾脆在首位使用command = aaa.method
,但也有一定的應用場合,這是不可能的。)
可以使用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
不要。這種方法引入的問題(安全性,清潔性,性能,可讀性等)很少有理由處理。只需使用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
靜態方法不應該有一個'self' PA rameter。靜態方法不與任何類或實例屬性交互。 – Daenyth 2011-04-26 15:43:40