Как избежать перезаписи производных классов при добавлении переменной члена класса? - PullRequest
1 голос
/ 09 июня 2019

Я столкнулся с проблемой изменения иерархии классов, когда я хочу добавить переменную-член в базовый класс, что требует переписывания конструкторов в производных классах.

Например, у меня есть что-то вроде этого:

class Animal:
    ___init___(self,animal_name):
        self.name = animal_name
class Cat(Animal):
    ___init__(self,animal_name,animal_pattern):
         self.pattern = animal_pattern
         super().__init__(self,animal_name)

Теперь предположим, что я добавляю переменную-член "age" в класс Animal:

class Animal:
    ___init___(self,animal_name,animal_age):
        self.name = animal_name
        self.age = animal_age
class Cat(Animal):
    ___init__(self,animal_name,animal_age,animal_pattern):
         self.pattern = animal_pattern
         super().__init__(animal_name,animal_age)

ThisДля изменения потребовалось добавить animal_age в качестве параметра в конструктор Cat.Если иерархия производных классов содержит много классов, это быстро становится утомительным и подверженным ошибкам.Есть ли способ избежать этого переписывания, как с точки зрения языковых особенностей, так и с точки зрения дизайна?

1 Ответ

1 голос
/ 09 июня 2019

Я понимаю, почему это может показаться утомительным, но нет никакого способа обойти это. Каждый подкласс должен иметь обязательные аргументы для передачи своему родительскому классу. Также было бы довольно неприятно, если бы это было не так. Допустим, вам не нужно явно набирать animal_name и animal_age. Теперь человеку, создающему экземпляр Cat, становится очень трудно понять, какие аргументы требуются. В настоящее время у вас есть все необходимые аргументы, видимые в Cat.

Вы можете использовать функцию *argv, но это только сделает ваш код очень запутанным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...