You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 08:06:05