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
相关产品推荐
相关产品推荐

