如何将子 class 的数据属性分配给其父 class 的属性

How to assign a data attribute of a subclass to attributes of its parent class

我有一个具有数据属性宽度和高度的 class 矩形,我想要一个具有数据属性 side_length.

的子 class 正方形

如何才能使 square.width 和 square.height 给出边长?即与 square.side

相同
class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height

class Square(Rectangle):
    def __init__(self, side)
        self.side = side

这是我目前所拥有的。

您可以调用 Rectangle 的构造函数。

super(Square,self).__init__(side, side)

或者您可以拥有 return 这些属性的属性。我会倾向于超级。

@property
def length(self):
   return self.side

@property
def width(self):
   return self.side

如果您可以在创建对象后更改 sideheightwidth 属性,事情会变得更加复杂。您需要保持 widthheight 同步和连贯。一种可能的方法是完全取消 side 作为 Square 上的存储属性,而是将其作为读写 属性 来更新 Rectangle 的宽度和高度。

保持 height/width/side 在初始构造函数之后排序:


class Rectangle:

    @property
    def height(self):
        return self._height

    @height.setter
    def height(self, value):
        self._height = value

    @property
    def width(self):
        return self._width

    @width.setter
    def width(self, value):
        self._width = value

    def __repr__(self):
        return(f"{self.__class__.__name__}:{self.height=} {self.width=}")

    def __init__(self, height, width):
        self.height = height
        self.width = width

class Square(Rectangle):

    def __repr__(self):
        return(f"{self.__class__.__name__}:{self.side=}")

    @property
    def side(self):
        return self._width

    @side.setter
    def side(self, value):
        self._width = value
        self._height = value

    def __init__(self, side):
        super(Square, self).__init__(side, side)

    #these are here so you can't cheat and vary height and width
    #independently on a square
    @property
    def width(self):
        return self.side

    @width.setter
    def width(self, value):
        self.side = value

    @property
    def height(self):
        return self._side

    @height.setter
    def height(self, value):
        self.side = value



rectangle = Rectangle(5,2)
print(rectangle)
rectangle.height = 6
print(rectangle)

square = Square(3)
print(square)
square.side = 6
print(square)
square.height = 9
print(square)

输出:

$ py test_square.py
Rectangle:self.height=5 self.width=2
Rectangle:self.height=6 self.width=2
Square:self.side=3
Square:self.side=6
Square:self.side=9