【发布时间】:2021-07-25 07:10:11
【问题描述】:
这几天我一直在努力理解这段代码的细节:
class Rectangle:
def __init__(self, length, width, **kwargs):
self.length = length
self.width = width
super().__init__(**kwargs)
def area(self):
return self.length * self.width
def perimeter(self):
return 2 * self.length + 2 * self.width
# Square inherits from Rectangle:
class Square(Rectangle):
def __init__(self, length, **kwargs):
super().__init__(length=length, width=length, **kwargs)
# Triangle doesn't inherit from any class:
class Triangle:
def __init__(self, base, height, **kwargs):
self.base = base
self.height = height
super().__init__(**kwargs)
def tri_area(self):
return 0.5 * self.base * self.height
# Pyramid inherits from square and triangle:
class Pyramid(Square, Triangle):
def __init__(self, base, slant_height, **kwargs):
self.base = base
self.slant_height = slant_height
# Adding attributes to kwargs dictionary
kwargs["height"] = slant_height
kwargs["length"] = base
super().__init__( base=base, **kwargs)
def area(self):
base_area = super().area()
perimeter = super().perimeter()
return 0.5 * perimeter * self.slant_height + base_area
def area_2(self):
base_area = super().area()
triangle_area = super().tri_area()
return triangle_area * 4 + base_area
继承树是这样的:
Rectangle
\
Square Triangle
\ /
Pyramid
Pyramid 类的 MRO:
(__main__.Pyramid,
__main__.Square,
__main__.Rectangle,
__main__.Triangle,
object)
我了解代码背后的总体思路,以及如何使用super().__init__ 将变量关键字参数字典传递给使用**kwargs 的超类。我遇到问题的详细信息是:
- 为什么我们在
Pyramid类中使用base=base而超类 (Square) 采用length参数? - 当我只放
super().__init__(base, **kwargs)而不是base=base时,为什么会出现错误提示 init() 获得了参数“长度”的多个值, 是因为上面指定了kwargs["length"]吗?如果是这样,base=base 如何解决这个问题? - 为什么在没有超类的 Rectangle 中有
super().__init__(**kwargs)?我的猜测可能是将 kwargs 传递给内置的object基类,以便Triangle可以继承它?但我不确定。 - 为什么
Triangle也会调用基类?这似乎是多余的(即使从 Triangle 中删除super().__init__(**kwargs)也不会改变任何事情)。
【问题讨论】:
标签: python inheritance multiple-inheritance