我有一个python类,可以作为其他子类的基类。它包含一个应该对所有子类都起作用的方法,例如我想把它放在基类中。问题是,此方法应返回子类的新实例。但是我因为基类位于子类的定义之前,所以我无法创建该子类的新实例,因为在基类的范围内它是未知的:
class Base:
def __init__(self, value):
self.value = value
def convert_child_classes(self, newclass):
newvalue = MakeUsableInNewclass(self.value)
newattr = MakeUsableInNewclass(self.subclassattr)
return newclass(newattr, newvalue)
class Child1(Base):
def __init__(self, subclassattr, value)
super(Child, self).__init__(value)
self.subclassattr = subclassattr
def MethodForSubClassAttr(self):
...do sth with self.subclassattr...
class Child2(Base):
def __init__(self, subclassattr, value)
super(Child, self).__init__(value)
self.subclassattr = subclassattr
def SomeOtherSubClassAttrMethod(self):
...do sth that is related to this class attr...
如果我有Child1的实例,我希望能够处理其数据,然后在调用convert_child_classes(Child2)时返回带有新值的Child2实例:
A = Child1('someattr', 5)
B = A.convert_child_classes(Child2)
现在B应该是Child2的实例,其值由Child1计算得出。但是,由于基类现在知道Child1或Child2是什么,因此无法启动新类。
答案 0 :(得分:1)
这样的事情应该起作用(未经测试):
class Measurement:
@classmethod
def from_other(cls, other):
base = other.convert_to_base_unit()
converted = cls.base_to_unit(base)
return cls(converted)
@classmethod
def base_to_unit(cls, value):
# Let the subclass implement this
raise NotImplementedError
def convert_to_base_unit(self):
# Let the subclass implement this
raise NotImplementedError
通过这种方式实现,基类不需要了解有关子类的任何信息。基类提供模板方法(from_other
),子类提供实现。
答案 1 :(得分:1)
我遇到了你的问题:
1.实际上,您正在Child
中使用super
,这是错误的,因为它应该是您正在操作的类的名称,在这种情况下为Child1
或{{1 }}。
2.我将Base添加为一个抽象类,以确保它不会被实例化(就像我从您的问题中得到的那样)。
3.由于必须强制执行方法Child2
,因此我将添加为MakeUsableInNewClass
以确保在子方法上实现。
因此正确的代码应为:
abstractmethod