Python 3:当子构造函数的参数多于父构造函数

时间:2017-12-06 19:30:02

标签: python inheritance fluent-interface

假设我有一个父类和多个子类,它们通过包含有关它们所代表的想法的更多特定信息来扩展父类。例如:

class Shape:
    def __init__(self, center):
        self.center = center


class Square(Shape):
    def __init__(self, center, side_length):
        super().__init__(self, center)
        self.side_length = side_length
        self.area = side_length ** 2


class Circle(Shape):
    def __init__(self, center, radius):
        super().__init__(self, center)
        self.radius = radius
        self.area = 3.14 * (radius ** 2)

假设我想在父类中实现一个方法,例如translate(new_center),它将返回一个与原始对象具有不同中心位置的新对象。因为所有子类的行为方式应该相同(即属性self.center应该更改),所以将translate()实现为父类Shape的方法是有意义的。

如果我想在每次调用Shape时返回translate()类型的新对象,我们可以简单地将translate()定义为Shape的方法,如下所示:< / p>

    def translate(self, new_center):
        return Shape(new_center)

但是,如果任何子类实例调用此方法,则结果将为Shape类型,因此原始实例包含的任何其他状态信息,例如side_length和{{1}对于area,将丢失。此外,Square无法定义为

translate()

因为每个子类的构造函数都需要父类构造函数不具备的附加参数。如何实现这一点而不必覆盖每个子类中的父方法(避免哪个是​​定义父方法的整个点)?

1 个答案:

答案 0 :(得分:2)

您可以复制对象并修改副本:

String pattern1 = "(?<!</li>\\s{0,100})(<li>)";
String replace1 = "<ul><li>";

String pattern2 = "</li>(?!\\s{0,100}<li>)";
String replace2 = "</li></ul>";