使用现有实例初始化超级?
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()
假设我有:
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()