我想从 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()
在字典中查找该类,并调用它以创建该子类的新实例。