Для 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 метод. Я могу думать о четырех неудовлетворительных решениях.

  1. Вызов альтернативного конструктора суперкласса в подклассе __init__ как показано ниже, не удается, потому что from_x не изменяет свой ввод как __init__ но возвращает значение больше как __new__,

    # failed solution
    
    class Child(Parent):
    
        def __init__(self):
            super().from_x(1)
    
  2. Вызов суперкласса from_x метод в подклассе __new__ как показано ниже, также происходит сбой, потому что оба метода вызывают друг друга по кругу.

    # failed solution
    
    class Child(Parent):
    
        def __new__(self):
            return super().from_x(1)
    
  3. Переопределение суперкласса from_x Метод в подклассе делает подкласс важным __init__ метод рудиментарный и заставляет его присвоить неправильное значение х.

    # bad solution
    
    class Child(Parent):
    
        @classmethod
        def from_x(cls):
            return super().from_x(1)
    
  4. Отказ от наследования и использование композиции вместо этого работает, но добавляет бесполезный уровень синтаксиса (т.е. child.parent.x).

    # unfortunate compromise solution            
    
    class Child:
    
        def __init__(self):
            self.parent = Parent.from_x(3)
    

Я пропустил лучший вариант для этой цели?

0 ответов

Другие вопросы по тегам