Для минималистского примера, скажем, у меня есть три класса: < /p>
class A():
def method(self):
print('A')
self._method()
def _method(self):
pass
class B(A):
def _method(self):
print('B')
class C(A):
def _method(self):
print('C')
< /code>
Я использую их как, например, < /p>
c = C()
c.method()
< /code>
Теперь я хочу иметь класс D, который изменяет поведение метода класса А. < /p>
class D():
def method(self):
self._method()
print('D')
def _method(self):
pass
< /code>
И аналогично, я бы хотел, чтобы B и C могли наследовать от d. < /p>
Есть несколько способов выполнить это: Я могу создать новые классы D, которые наследуют от b и c: < /p>
class D_B(B):
def method(self):
self._method()
print('D')
class D_C(C):
def method(self):
self._method()
print('D')
< /code>
или я могу создать новые классы B и C, которые наследуют от D, вместо A. < /p>
class B_D(D):
def _method(self):
print('B')
class C_D(D):
def _method(self):
print('C')
< /code>
Оба этих решения включают в себя довольно избыточный код. В первом, D_B и D_C имеют точно одинаковое определение метода. В последнем, B_D и C_D имеют те же самые определения _method, что и B и C. Так что, как правило, кажется, что это должно быть чем -то, что я должен быть в состоянии достичь лучшим образом, но я не знаком с тем, как. Я также должен отметить, что это не просто вопрос «это выглядит излишним и чувствует себя плохо». В действительности, количество классов «листьев» (B и C) намного выше 2, а количество «корня» (A и D) также может расти. Было бы обслуживание адского администрирования, чтобы изменить каждую «копию» класса для каждого изменения. контролируется, например, флагом в инициализации: < /p>
class A():
def __init__(self, flag = True):
self.flag = flag
def method(self):
if self.flag:
print('A')
self._method()
else:
self._method()
print('D')
def _method(self):
pass
< /code>
Пока что это мой предпочтительный подход, но мне интересно, возможно ли иметь то же самое, но вместо отдельных классов. В частности, я хотел бы, так или иначе, иметь возможность рассказать родительскому классу при построении или инициализации моего экземпляра, то есть я хотел бы сделать что -то вроде: < /p>
b = B(A)
c = C(D)
< /code>
Таким образом, B создается как экземпляр B, который наследует метод A, в то время как C создается как экземпляр C, который наследует метод B. Возможно ли это? Есть ли конкретное имя для того, что я пытаюсь сделать?
Подробнее здесь: https://stackoverflow.com/questions/794 ... -in-python
Унаследование класса во время строительства/инициализации в Python? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение