如何从超类实例创建子类实例



我想从 Python 中的超类实例创建一个子类实例。假设我有这样的东西:

class A():
    def __init__(self, type):
        ...
        self.type = type # this will be something that corresponds to either B or C
class B(A):
    def do_something():
        # this method is subclass specific
class C(A):
    def do_something():
        # this method is again subclass specific

我有一个接收 A 实例的函数,我需要根据 A 的属性type创建 B 或 C(或 D ...(的实例。

我不知道该怎么做。有没有办法解决这个问题,或者解决方案是否需要重新设计?

谢谢

首先重新定义类 A、B 和 C,如下所示。请注意,您还需要通过以下方式将type值从子类传递到超类构造函数super().__init__()

class A():
    def __init__(self, type):
        ...
        self.type = type # this will be something that corresponds to either B or C
class B:
    def __init__(self, type):
        super().__init__(type)
    def do_something(self):
        print('do_something called for B')
class C:
    def __init__(self, type):
        super().__init__(type)
    def do_something(self):
       print('do_something called for C')

然后创建另一个类,该类可以决定是否为您调用 B 和 C,并将该对象保存在本地

class User:
    def __init__(self, type):
        self.obj = None
        if type == 'B':
            self.obj = B(type)
        elif type == 'C':
            self.obj = C(type)

然后,您可以使用不同类型的用户类实例化,并查看是否调用了正确的do_something

user_B = User('B')
user_B.obj.do_something()
#do_something called for B
user_C = User('C')
user_C.obj.do_something()
#do_something called for C

使用从类型映射到类的字典。

class A():
    typemap = {}
    def __init__(self, typearg): # renamed this argument so it doesn't shadow standard type() function
        self.type = typearg
        self.typemap[typearg] = type(self)
    def create_child(self, *args):
        return typemap[self.type](*args)

当构造函数运行时,type(self)获取正在创建的对象的子类。然后将其存储在字典中,因此我们可以使用 self.type .

create_child()在字典中查找该类,并调用它以创建该子类的新实例。

相关内容

  • 没有找到相关文章

最新更新