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



假设我有:

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)

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

我的 OOP 背景是C++,由于能够在C++中重载构造函数,我不断进入这些场景,因此解决此问题的方法会很棒。

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

如果您控制了Super源,则可以使from_b方法创建给定子类的实例,并让子类在其__new__方法中调用from_b方法,以便可以直接创建和初始化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()

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

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)

顺便说一下,记住"构造函数"方法(如from_b()(通常((返回一个新对象,而__init__()仅在创建对象后初始化对象,这可能会有所帮助。

最新更新