【发布时间】:2021-08-25 08:36:46
【问题描述】:
我想将玩家可以执行的动作分组到一个名为“动作”的类中。
这些操作包括在玩家购买或出售某物时更新他的银行账户余额。这意味着能够从“Action”类调用“Player”类的“get_account”方法。为此,我通过编写在这两个类之间添加了遗传性的概念
class Action (Player):
这是我的完整代码
from typing import Any
class BankAccount:
name: str
balance: float
def __init__(self, name: str, balance: float) -> None:
self.name = name
self.balance = balance
class Player(Action):
name: str
def __init__(self, **kwargs: Any) -> None:
self.name = kwargs['name']
self.account_bank = None
def set_account(self, name, balance) -> None:
self.account_bank = BankAccount(name, balance)
def get_account(self) -> BankAccount:
return self.account
def action(self, choice, price):
if choice == 1:
self.buy_something(price)
if choice == 2:
self.sell_something(price)
else:
pass
class Action(Player):
def buy_something(self, price):
self.get_account().balance -= price
def sell_something(self, price):
self.get_account().balance += price
kwargs = {'name': 'jason'}
jason = Player(**kwargs) # Create player 'jason'
jason.set_account('my_account', 100) # Adds Jason an account with $ 100
jason.action(1, 20) # buy something for 20 dollars
jason.action(2, 15) # sell something for 15 dollars
我的问题是我还需要能够从“播放器”类中调用“动作”类的方法。事实上,“Player”类有一个“action”方法,它允许您在“Action”类中分组的方法中做出选择。 (我真的需要能够将玩家的动作列表分组到一个专门的类中)
我该怎么做?
【问题讨论】:
-
你不需要
Action来继承任何东西。只需删除继承 (class Action:) 并将其移至class Player上方。 -
您能否提供更多背景信息,为什么您需要这样的设置?如此紧密的耦合,为什么
Action和Player甚至是两个独立的类?为什么Action是一个具体类而不是抽象类或mixin 类? -
@quamrana,如果我从“Action”类中删除继承,如何从中调用“Player”类的“get_account()”方法?
-
@MisterMiyagi,我不明白“抽象或混合类”的概念。试图解释我的问题的背景......我想开发一个强化学习模型,使代理(玩家)在他的环境中进化。在每一步,代理都必须采取行动。为了清楚起见,我想对它可以采取的操作进行分组,以免它们与不相关的 set_account () 或 get_account () 方法混淆。
-
@David:我不明白。当你尝试我的建议时发生了什么?
标签: python python-3.x class inheritance methods