如何将子 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
如果您可以在创建对象后更改 side
、height
或 width
属性,事情会变得更加复杂。您需要保持 width
和 height
同步和连贯。一种可能的方法是完全取消 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
我有一个具有数据属性宽度和高度的 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
如果您可以在创建对象后更改 side
、height
或 width
属性,事情会变得更加复杂。您需要保持 width
和 height
同步和连贯。一种可能的方法是完全取消 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