假设我有:
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__()
仅在创建对象后初始化对象,这可能会有所帮助。