Давайте посмотрим на конкретный экземпляр в сообщении блога, на которое вы ссылаетесь.
class Shape:
def __init__(self, shapename, **kwds):
self.shapename = shapename
super().__init__(**kwds)
class ColoredShape(Shape):
def __init__(self, color, **kwds):
self.color = color
super().__init__(**kwds)
cs = ColoredShape('red', shapename='circle', radius=30)
TypeError: object.__init__() takes no arguments
Когда мы создаем объект ColoredShape
, нам потребуется ввести цвет и имя фигуры.Если вы передадите неожиданный аргумент ключевого слова, он выдаст вам ошибку.Это связано с тем, что все классы по умолчанию (в Python 3) наследуются от встроенного типа object
, который имеет __init__
, который не требует аргументов.
Как указывалось в статье, object
гарантированно будет последним классом, вызываемым в MRO.Однако если вы удалите вызов super в Shape, вы можете добавить любое количество ключевых слов без проблем, даже если они не будут использоваться ни для чего.
class Shape:
def __init__(self, shapename, **kwds):
self.shapename = shapename
class ColoredShape(Shape):
def __init__(self, color, **kwds):
self.color = color
super().__init__(**kwds)
cs = ColoredShape('red', shapename='circle', radius=30, diameter=60)
В своем коде, который вы разместили, вы наследуетесь от abc, который не делает окончательный вызов init объекта через super.Таким образом, шаблон дизайна, который показан в сообщении блога, не применяется в вашем случае.Надеюсь, это поможет.