Python类的相互依赖性

时间:2018-12-08 12:05:38

标签: python class inheritance class-structure

我有一个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是什么,因此无法启动新类。

2 个答案:

答案 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