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

Python OOP:如何通过一个对象的方法修改另一个对象的属性?

问题解决:Character类攻击功能异常输出None

问题根源

你的代码存在几处关键问题:

  • punch方法设计不符合面向对象逻辑:当前仅接收数值返回计算结果,未直接作用于目标对象,若实际代码存在笔误(比如漏写return),会直接返回None。
  • 直接修改对象属性违背封装原则:你直接赋值char2.health,既没利用已有的set_health方法,也无法统一处理生命值边界(比如防止生命值为负)。
  • 额外提醒:range是Python内置函数,用它做属性名虽不报错,但易引发混淆,建议改名(比如attack_range)。

修复后的代码

重构Character类

class Character:
    def __init__(self, health, power, attack_range, position):
        self.health = health
        self.power = power
        self.attack_range = attack_range  # 替换原range属性
        self.position = position

    def get_health(self):
        return self.health

    def set_health(self, value):
        # 简化生命值修改逻辑,同时限制最小值为0
        self.health -= value
        if self.health < 0:
            self.health = 0

    def punch(self, target):
        # 直接让攻击作用于目标对象,调用目标的set_health方法
        target.set_health(self.power)

正确使用方式

from character import Character

char1 = Character(100, 25, 5, 3)
char2 = Character(100, 20, 3, 4)

# char1发起攻击,传入目标char2
char1.punch(char2)

print(char2.get_health())  # 输出:75

原代码为何可能输出None

如果你的代码和贴出的完全一致,理论上应输出75,但出现None大概率是实际代码存在笔误:

  • punch方法漏写return value语句,函数默认返回None。
  • get_health方法漏写return self.health,导致传入punch的是None,最终计算后仍返回None。

内容的提问来源于stack exchange,提问作者amoez200

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:43:11