Для Python 3.5, может ли подкласс быть построен из альтернативного конструктора его суперкласса?
Это угол, который я нарисовал в несколько раз. Я бы подумал, учитывая, насколько распространены альтернативные конструкторы в Python, что было бы неслыханно построить подкласс из альтернативного конструктора его суперкласса, но я не могу думать о том, как это сделать или найти обсуждение этого в Интернете.
Для иллюстрации проблемы. Скажем, у меня есть следующий игрушечный суперкласс.
class Parent:
def __init__(self):
self.x = 0
@classmethod
def from_x(cls, x):
a = cls()
a.x = x
return a
Теперь скажите, что я хочу подкласс Parent
используя его from_x
метод. Я могу думать о четырех неудовлетворительных решениях.
Вызов альтернативного конструктора суперкласса в подклассе
__init__
как показано ниже, не удается, потому чтоfrom_x
не изменяет свой ввод как__init__
но возвращает значение больше как__new__
,# failed solution class Child(Parent): def __init__(self): super().from_x(1)
Вызов суперкласса
from_x
метод в подклассе__new__
как показано ниже, также происходит сбой, потому что оба метода вызывают друг друга по кругу.# failed solution class Child(Parent): def __new__(self): return super().from_x(1)
Переопределение суперкласса
from_x
Метод в подклассе делает подкласс важным__init__
метод рудиментарный и заставляет его присвоить неправильное значение х.# bad solution class Child(Parent): @classmethod def from_x(cls): return super().from_x(1)
Отказ от наследования и использование композиции вместо этого работает, но добавляет бесполезный уровень синтаксиса (т.е.
child.parent.x
).# unfortunate compromise solution class Child: def __init__(self): self.parent = Parent.from_x(3)
Я пропустил лучший вариант для этой цели?