前言:根据我的理解,这个问题的现有答案假设控制源或解决问题。
给定一个
Super
类,以及从它派生的 MyClass
:如何将 Super
类的现有实例用作基类?目标是不使用 super().__init__()
中的字段调用 existing_super
,而是使用现有对象。类似于 C++ 中复制构造函数的使用方式。只有 MyClass
可以调整,Super
必须保持不变。
class Super:
def __init__(self, constructed, by, the, super_factory):
""" no `existing_super` accepted """
pass
class MyClass(Super):
def __init__(self, existing_super):
""" ????? """
pass
s = super_factory()
mine = MyClass(s)
如果这是不可能的,猴子补丁
Super
会有帮助吗?如果 Super
使用/不使用 slots
会怎样?
解决此问题的一种方法是使用
__class__
属性将超类的实例转换为子类的实例。
class A:
def __init__(self):
self.A_attribute = 'from_A'
class B(A):
def __init__(self):
#Create an instance of B from scratch
self.B_attribute = 'from_B'
super().__init__()
def init_A(self):
#Initializes an instance of B from what is already an instance of A
self.B_attribute = 'from_B'
myA = A()
myA.__class__ = B
myA.init_A()
我对同样的问题思考了太久。 这似乎是解决方案。
class ObjectA:
def __init__(self, a, b):
self.a = a
self.b = b
class ObjectB(ObjectA):
def __init__(self, instanceA: ObjectA):
super().__init__(**instanceA.__dict__)
# instance of parent class created
y = ObjectA(a=1,b=2)
# instance of parent class used to initialize child class
x = ObjectB(y)
# child class successfully inherits attributes of parent
x.a