参数和子类化

Arguments and subclassing

考虑一个长方形和一个正方形。如果我们将它们视为对象,那么很明显正方形可以从矩形继承其大部分或全部属性,因为正方形是矩形的特例。唯一的限制是正方形的边长必须相似。

看看这个非常基本的实现。

class Rectangle(object):

    def __init__(self, x, y):
        self.x = x
        self.y = y

    def get_area(self):
        return self.x * self.y


class Square(Rectangle):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if self.x != self.y:
            raise ValueError("x and y must be equal.")

为简单起见,避免了类型检查。我使用 argskwargs 以确保子 class(es) 将是未来的证明。但是,我不确定我是否做对了。 Rectangle class' __init__ 将来可能会添加更多参数。

问题是,如果 x 和 y 必须相等,为什么一开始就要求它们都相等?不应该只有一个吗?当前的继承方案有这个限制——用户被强制输入 x 和 y。这个问题怎么解决。将 x 和 y 转换为关键字参数不是解决方案,因为不允许使用默认值(或 None)。

你可以这样做:

class Square(Rectangle):

    def __init__(self, x):
        super().__init__(x, x)
        if self.x != self.y:
            raise ValueError("x and y must be equal.")

如果你想添加 *args**kwargs 你可以。但是,顺便说一句,如果您将 *args**kwargs 传递给 Rectangle,这将不会产生任何结果 "future proof",因为 Rectangle 不接受它们。