我有以下簡化代碼:
class States:
def __init__(self):
pass
def state1(self):
a = 2*10
return a
def state2(self):
a = 50/10
return a
class Results:
def __init__(self):
pass
def result(self):
states = States()
x = []
for i in [state1,state2]:
state_result = states.i()
x.append(state_result)
return x
我想遍歷“States”類中的每個函式。當然
for i in [state1,state2]
將回傳“名稱 'state1' 未定義”,但我希望它能提供我嘗試實作的目標。
uj5u.com熱心網友回復:
您可以使用dir()來獲取類的函式名稱。然后您可以使用getattr()來呼叫該函式。
class States:
def __init__(self):
pass
def state1(self):
a = 2*10
return a
def state2(self):
a = 50/10
return a
state = States()
for func in dir(States):
if func.startswith('__'):
continue
print(func)
print(getattr(state, func)())
會輸出
state1
20
state2
5.0
uj5u.com熱心網友回復:
你可以這樣做:
def result(self):
states = States()
x = []
for i in [states.state1,states.state2]: # changed state1 to states.state1 and so on
state_result = i()
x.append(state_result)
return x
uj5u.com熱心網友回復:
我認為你可以使用lambda。在這里,我為你做了一個簡單的例子。
def foo(text):
print(text)
a = [lambda: foo("hey"), lambda: foo("boo")]
for i in a:
i()
結果:
hey
boo
在你的情況下,你應該過來:
for i in [lambda: state1(), lambda:state2()]:
state_result = i()
x.append(state_result)
但是如果你問我的意見,重要的是要告訴你通過串列??呼叫函式不是一種健康的方式。對于許多情況,軟體語言通常都有解決方案;但在這種情況下,我認為你的觀點是錯誤的。通過弄亂內置技術并試圖找到一些秘密技巧來作業并不是建議的事情。
uj5u.com熱心網友回復:
做到這一點的干凈方法是“注冊”您的狀態方法。像這樣的東西:
class States():
states = []
def register_state(cache):
def inner(fn):
cache.append(fn)
return inner
@register_state(states)
def state1(self):
a = 2*10
return a
@register_state(states)
def state2(self):
a = 50/10
return a
那么你的結果類可以做
class Results:
def __init__(self):
pass
def result(self):
states = States()
x = []
for i in states.states:
state_result = i(states)
x.append(state_result)
return x
uj5u.com熱心網友回復:
您可以通過類的 dict 獲取類 States 的成員,如下所示:
States.__dict__
這將為您提供類的所有屬性和功能:
{'__module__': '__main__', '__init__': <function States.__init__ at 0x00000183066F0A60>, 'state1': <function States.state1 at 0x00000183066F0AF0>, 'state2': <function States.state2 at 0x000001830 ...
您可以將其過濾到串列理解字典中,以不將 dunders 包括在內:
[funcname for funcname in States.__dict__ if not (str.startswith('__') and str.endswith('__'))]
這將回傳一個成員函式串列,如下所示:
['state1', 'state2']
然后創建一個狀態物件:
states = States()
將整個計算完成為:
for funcname in [funcname for funcname in States.__dict__ if not (funcname.startswith('__') and funcname.endswith('__'))]:
x.append(States.__dict__[funcname](states))
更好的是,將其理解為:
[States.__dict__[funcname](states) for funcname in States.__dict__ if not (funcname.startswith('__') and funcname.endswith('__'))]
應用此方法后,您的答案是: [20, 5.0]
或獲取 functionName 和 returnValues 的 dict 作為理解:
{funcname: States.__dict__[funcname](states) for funcname in States.__dict__ if not (funcname.startswith('__') and funcname.endswith('__'))}
這會給你一個輸出:
{'state1': 20, 'state2': 5.0}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/391712.html
上一篇:使用給定數字的數字創建鏈表
