Python无法继承时如何在Player类中调用Environment类的get_tax方法
实现方案
核心逻辑是给每个Player实例绑定其所属的Environment实例引用,无需继承,完全不影响get_user方法的->Player类型注解。
具体修改点:
- Player类的初始化方法新增
environment参数,存储玩家所属的环境实例 - Environment类创建Player实例时,将当前环境对象(self)作为参数传入
- Player的交易方法中通过存储的环境实例调用
get_tax()获取税率 - 额外优化:原代码
sell_something方法的金额计算逻辑有误,卖出商品需要扣除税费,已修正为price*(1 - tax)
修改后完整可运行代码:
from typing import Any import random class BankAccount: name: str balance: float def __init__(self, name: str, balance: float) -> None: self.name = name self.balance = balance class Player: name: str def __init__(self, environment: "Environment", **kwargs: Any) -> None: self.environment = environment # 存储所属环境实例 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_bank def buy_something(self, price): tax = self.environment.get_tax() # 通过所属环境获取税率 self.get_account().balance -= (price * (1 + tax)) # 买入需要付商品价+税费 def sell_something(self, price): tax = self.environment.get_tax() # 通过所属环境获取税率 self.get_account().balance += (price * (1 - tax)) # 卖出收入扣除税费,原代码的+号已修正为-号 def action(self, choice, price): if choice == 1: self.buy_something(price) elif choice == 2: # 原代码第二个if改成elif避免冗余判断 self.sell_something(price) else: pass class Environment: def __init__(self, tax_min, tax_max): self.tax_min = tax_min self.tax_max = tax_max self.players = {} def get_tax(self): return random.uniform(self.tax_min, self.tax_max) def add_player(self, name: str) -> None: kwargs = {'name': name} self.players[name] = Player(self,**kwargs) # 创建玩家时传入当前环境实例 def get_user(self, name: str) -> Player: # 原有类型注解完全不受影响 return self.players[name] env = Environment(0.10, 0.20) # 实例化一个税率浮动范围为10%到20%的环境 player_name = 'jason' env.add_player(player_name) # 创建名为jason的玩家 jason = env.get_user(player_name) jason.set_account('my_account', 100) # 为jason开设余额为100美元的账户 jason.action(1, 20) # 买入价值20美元的物品 print(jason.get_account().__dict__)
运行效果说明
实例中jason初始余额100美元,买入20美元商品,加上10%20%的税费,最终余额会在7678美元区间浮动,符合业务预期。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

