[英]Dynamically setting attribute as function in Python class
我正在創建一個簡單的游戲,其中包含名為“ Player”和“ Strategy”的類。 創建播放器時,我想將策略實例分配給播放器實例。
class Player(object):
def __init__(self):
self.Strategy = None
def Decision(self, InputA, InputB):
Result = self.Strategy(InputA, InputB)
return Result
def SetStrategy(self):
# Sets a strategy instance to the Player instance
class Strategy(object):
def Strategy1(self, InputA, InputB):
return InputA * InputB
def Strategy2(self, InputA, InputB):
return (InputA - InputB) / 2
def Strategy3(self, InputA, InputB):
return 0
我想要達到的目標:
in [0] Player1 = Player()
in [1] Player2 = Player()
in [2]:Player1.SetStrategy('Strategy1')
in [3]:Player2.SetStrategy('Strategy3')
in [4]:Player1.Decision(2,5)
出[0]:10
in [5]:Player2.Decision(3,6)
出[1]:0
在這里和通過google搜索可以為我展示猴子修補的方法,但是這種方法看起來有些不雅(盡管我是初學者,我認為有更好的方法可以做到)-有沒有辦法通過繼承做到這一點?我沒看到嗎?
def strategy1(inputA, inputB): # 2
return inputA * inputB
def strategy2(inputA, inputB):
return (inputA - inputB) / 2
def strategy3(inputA, inputB):
return 0
strategy = {
'mul': strategy1,
'diff': strategy2,
'zero': strategy3
}
class Player(object):
def __init__(self, strategy_name='mul'): # 1
self.strategy_name = strategy_name # 5
def decision(self, inputA, inputB): # 4
result = strategy[self.strategy_name](inputA, inputB)
return result
player1 = Player()
player2 = Player()
player1.strategy_name = 'mul' # 3
player2.strategy_name = 'zero'
print(player1.decision(2, 5))
# 10
print(player2.decision(3, 6))
# 0
每個玩家都有一個策略,因此在沒有分配某些策略的情況下不允許實例化玩家。 你可以使用默認的策略(如下圖所示),或進行strategy
強制性的說法。
這些策略可以是簡單的功能; 我認為沒有理由將它們捆綁為Strategy類的方法。 始終保持代碼盡可能簡單; 當一個函數足夠時不要使用類 ; 當類提供某些功能(例如繼承)時,請使用該類,這會使基於類的解決方案更加簡單。
在Python中, 不需要像setStrategy
這樣的getter / setter setStrategy
。 您可以將簡單屬性用於簡單值,將屬性用於實現更復雜的行為。 屬性和屬性使用相同的語法,因此您可以從一個切換到另一個,而不必更改是否使用了類。
有一個約定(在PEP8中建議),即在CamelCase中命名類,而實例,函數和變量以小寫形式命名。 該約定無處不在,遵循該約定將有助於其他人更輕松地理解您的代碼。
為了便於將策略存儲在數據庫中,可以將strategy_name
存儲在數據庫中,然后使用查找字典(例如strategy
)將名稱與實際函數相關聯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.