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

Python Pygame子类属性未覆盖父类?输出不符合预期问题求助

问题原因及解决方案

情况1:父类初始化时提前执行了打印操作

你的代码逻辑大概率是父类在__init__里加载完图片后立刻打印尺寸,而子类是先调用super().__init__()——此时父类已经执行了打印操作,输出的是父类处理后的尺寸——之后才给self.image赋值子类的图片。虽然子类确实覆盖了image属性,但打印动作在覆盖之前就完成了,所以你看到的是父类的尺寸。

举个典型的错误代码示例:

class Person:
    def __init__(self):
        # 父类加载并缩放person.png(98x106 → 49x53)
        self.image = self.load_and_resize("person.png")
        # 父类在此处提前打印了尺寸
        print(self.image.size)

    def load_and_resize(self, path):
        # 模拟图片加载与缩放逻辑
        img = ...  # 实际加载图片的代码
        return img.resize((img.width//2, img.height//2))

class Teacher(Person):
    def __init__(self):
        # 先执行父类初始化,此时已经打印了父类的尺寸
        super().__init__()
        # 之后才覆盖image属性,但打印动作已经完成
        self.image = self.load_and_resize("teacher.png")

修正方案:

  • 把打印逻辑从父类__init__中剥离,单独写一个方法(比如print_image_size()),在子类完成所有初始化后调用;
  • 或者调整父类逻辑,使用钩子方法让打印动作在子类赋值后执行。

修改后的示例代码:

class Person:
    def __init__(self):
        self.image = self.load_and_resize("person.png")

    def load_and_resize(self, path):
        img = ...
        return img.resize((img.width//2, img.height//2))

    def print_image_size(self):
        print(self.image.size)

class Teacher(Person):
    def __init__(self):
        super().__init__()
        self.image = self.load_and_resize("teacher.png")

# 调用方式
teacher = Teacher()
teacher.print_image_size()  # 此时输出teacher.png缩放后的62x86

情况2:子类未正确赋值实例属性

如果子类加载图片时,没有把结果赋值给self.image,而是用了局部变量image,就无法覆盖父类的self.image。比如错误代码:

class Teacher(Person):
    def __init__(self):
        super().__init__()
        # 错误:仅定义了局部变量,未赋值给实例属性self.image
        image = self.load_and_resize("teacher.png")

修正方案:确保子类把加载后的图片赋值给self.image,这样才能覆盖父类的实例属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:57:23