使用现有实例初始化超级?

Init super with existing instance?

假设我有:

class Super:
  def __init__(self,a):
     self.a = a
  @classmethod
  def from_b(cls,b):
     return cls(b.to_a())

class Regular(Super):
   def __init__(self,b):
      # how to set my super to the output of
      super = super.from_b(b)

如何使用 super class 方法的输出而不是 init 正确初始化 super class?

我的 OOP 背景是 C++,由于能够在 C++ 中重载构造函数,我不断地接触到这些场景,所以解决这个问题的方法会很棒。

这有点尴尬(因为您尝试做的事情有点尴尬),但它会起作用:

class Super:
  def __init__(self,a):
     self.a = a
  @classmethod
  def from_b(cls,b):
     return cls(b.to_a())

class Regular(Super):
   def __init__(self,b):
      a = Super.from_b(b).a
      super().__init__(a)

顺便说一下,它可能有助于记住 "constructor" 方法,例如 from_b()(通常)returns 一个新的对象,而 __init__() 在对象创建后初始化

@shx2 的答案有效,但 wastefully/awkwardly 创建了一个一次性的 Super 对象,只是为了使用其 a 属性初始化新的 Regular 对象。

如果你能控制Super的源码,你可以让from_b方法创建给定子类的一个实例,让子类调用from_b方法它的 __new__ 方法,因此 Regular 对象可以直接创建和初始化:

class Super:
    def __init__(self, a):
        self.a = a

    @classmethod
    def from_b(cls, b):
        obj = super().__new__(cls)
        cls.__init__(obj, b.to_a())
        return obj

class Regular(Super):
    def __new__(cls, b):
        return super().from_b(b)

这样下面的断言就会通过:

from unittest.mock import Mock

obj = Regular(Mock())
assert type(obj) is Regular
assert obj.a.to_a.is_called()