我想从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 ...)的实例。
我不确定该怎么做。有没有解决的办法,还是需要重新设计解决方案?
谢谢
答案 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