簡體   English   中英

在Python類中將屬性動態設置為函數

[英]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

  1. 每個玩家都有一個策略,因此在沒有分配某些策略的情況下不允許實例化玩家。 你可以使用默認的策略(如下圖所示),或進行strategy強制性的說法。

  2. 這些策略可以是簡單的功能; 我認為沒有理由將它們捆綁為Strategy類的方法。 始終保持代碼盡可能簡單; 當一個函數足夠時不要使用類 ; 當類提供某些功能(例如繼承)時,請使用該類,這會使基於類的解決方案更加簡單。

  3. 在Python中, 不需要setStrategy這樣的getter / setter setStrategy 您可以將簡單屬性用於簡單值,將屬性用於實現更復雜的行為。 屬性和屬性使用相同的語法,因此您可以從一個切換到另一個,而不必更改是否使用了類。

  4. 有一個約定(在PEP8中建議),即在CamelCase中命名類,而實例,函數和變量以小寫形式命名。 該約定無處不在,遵循該約定將有助於其他人更輕松地理解您的代碼。

  5. 為了便於將策略存儲在數據庫中,可以將strategy_name存儲在數據庫中,然后使用查找字典(例如strategy )將名稱與實際函數相關聯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM