Являются ли аргументы ключевых слов хорошей практикой при использовании модуля ABC? - PullRequest
0 голосов
/ 17 февраля 2019

Этот вопрос является продолжением этого .

При использовании super() для множественного наследования , предлагаемый подход заключался в использовании аргументов ключевого слова для передачиоставшиеся значения в цепочке вызовов.

При использовании модуля ABC рекомендуется ли делать то же самое в методе super().__init__?

В блоге, о котором говорится в документации Pythonsuper() ссылается, ничего не упоминает об использовании **kwargs и ABC модуля.Он ориентирован на множественное наследование с конкретными классами.Перефразируя мой вопрос, применим ли совет по использованию **kwargs с super() к классам, которые используют модуль ABC?

Например:

from abc import ABC


class GameWeapon(ABC):

    def __init__(self, name, damage, **av):
         super().__init__(**av)
         self.name = name
         self.required_strength = required_strength
         self.damage = damage


class ChargeGun(GameWeapon):

    def __init__(self, name, required_strength, damage, **av):
        super().__init__(name=name,damage=damage,**av)

1 Ответ

0 голосов
/ 18 февраля 2019

Давайте посмотрим на конкретный экземпляр в сообщении блога, на которое вы ссылаетесь.

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.Таким образом, шаблон дизайна, который показан в сообщении блога, не применяется в вашем случае.Надеюсь, это поможет.

...