参数和子类化
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.")
为简单起见,避免了类型检查。我使用 args
和 kwargs
以确保子 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
不接受它们。
考虑一个长方形和一个正方形。如果我们将它们视为对象,那么很明显正方形可以从矩形继承其大部分或全部属性,因为正方形是矩形的特例。唯一的限制是正方形的边长必须相似。
看看这个非常基本的实现。
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.")
为简单起见,避免了类型检查。我使用 args
和 kwargs
以确保子 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
不接受它们。