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

时间:2019-04-10 17:17:10

标签: python design-patterns

我想从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 ...)的实例。

我不确定该怎么做。有没有解决的办法,还是需要重新设计解决方案?

谢谢

2 个答案:

答案 0 :(得分:0)

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

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()在字典中查找该类,然后调用它来创建该子类的新实例。

答案 1 :(得分:0)

开始重新定义类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