使用现有对象初始化超类(复制构造函数)

问题描述 投票:0回答:2

前言:根据我的理解,这个问题的现有答案假设控制源或解决问题。

给定一个

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
会怎样?

python inheritance constructor super
2个回答
0
投票

解决此问题的一种方法是使用

__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()

0
投票

我对同样的问题思考了太久。 这似乎是解决方案。

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
© www.soinside.com 2019 - 2024. All rights reserved.