子类的属性没有覆盖父类中定义的属性

问题描述 投票:0回答:1

我有一个像这样定义的父类和两个子类

import pygame
class Person():
    def __init__(self):
        self.image = pygame.image.load('person.png').convert_alpha()
        self.image = pygame.transform.scale(self.image, 
                                            (int(self.image.get_width() * 0.5), 
                                             int(self.image.get_height() * 0.5)))
        print('size: ', self.image.get_size())

class Teacher(Person):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load('teacher.png').convert_alpha()
        
class Doctor(Person):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load('doctor.png').convert_alpha()
        self.image = pygame.transform.scale(self.image, 
                                            (int(self.image.get_width() * 1.2), 
                                             int(self.image.get_height() * 0.75)))
...

person.png
teacher.png
doctor.png
的图片尺寸分别为98x106、134x179和97x178。

当我运行以下代码时,它的输出让我感到困惑。子类

pygame.image.load()
pygame.transform.scale()
中的代码
Teacher
Doctor
似乎没有覆盖父类
Person
中定义的属性。

pygame.display.set_mode((500, 500))
players =  {'Teacher': Teacher(), 'Doctor': Doctor()}
Output:
pygame 2.4.0 (SDL 2.26.4, Python 3.10.9)
Hello from the pygame community. https://www.pygame.org/contribute.html
size:  (49, 53) <---- expected to be (62, 86)
size:  (49, 53) <---- expected to be (116, 133)

发生什么事了?我做错了什么?

python pygame
1个回答
0
投票

这取决于一切执行的顺序:

在子类中,您调用超级构造函数(super().init()),它仍然会加载图片 person.png 并输出大小。只有之后子类的构造函数中的代码才会被执行。因此,在构建之后,图像属性应该设置正确,但在打印输出时却并非如此。

© www.soinside.com 2019 - 2024. All rights reserved.