0

这是我画过几次的角落。考虑到 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__方法退化,并使其为 x 分配错误的值。

    # 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)
    

我是否错过了实现这个目标的更好选择?

4

0 回答 0