在 Python 中,是否可以获取一个类并删除其成员函数之一?即:A类有7个成员函数。其他五个类继承自类 A。现在,假设其中一个类不想要类 A 的成员函数之一。有没有办法保持该功能的出现?
2 回答
现在,假设其中一个类不需要 A 类的成员函数之一。有没有办法保持该功能的出现?
__dir__方法允许您控制“显示”哪些方法。它不会禁用该方法,它只是允许您控制所看到的内容。
理想情况下,这种努力应该伴随着覆盖有问题的方法并让它引发NotImplementedError(例如,这是 Python 的collections.Counter.fromkeys()方法中使用的方法。
根据方法的不同,还有其他禁用它的方法。例如,可以通过将继承的 __hash__ 方法设置为None来禁用它(例如,这是在集合抽象基类中使用的方法,例如collections.Mapping)。
一般来说,您不应该在子类中删除部分基类的 API。这是因为继承的要点之一是子类的实例是基类的实例。如果他们缺少方法,事情可能会以尴尬的方式打破。
也就是说,如果调用不合适,有时可以覆盖继承的方法并引发异常。这可能只是在参数不是子类需要的情况下,但在某些情况下它可能适用于所有调用。不过,请尝试使异常有用,因为程序员AttributeError
在调用已记录的方法时遇到意外或其他常见错误是没有乐趣的。
这是一个子类的示例,它覆盖了其超类的部分 API 以禁止其使用。请注意,我使用的是 getter 和 setter 方法,这通常不是很 Pythonic,但易于理解(最好使用property
s)。
基类:
class Rectangle(object):
def __init__(self, width, height):
self._width = width
self._height = height
def get_width(self):
return self._width
def set_width(self, value):
self._width = value)
def get_height (self):
return self._height
def set_height (self, value):
self._height = value)
def area(self):
return self.get_width() * self.get_height()
和一个子类:
class Square(Rectangle):
def __init__(self, side):
self._side = side
def get_side(self):
return self._side
def set_side(self, value):
self._side = value
get_width = get_height = get_side
def set_width(self, value):
raise TypeError("Squares cannot have their sides changed individually")
set_height = set_width
该area
方法是继承的,并且仍然可以在Square
类中按预期工作,其他仅调用实例的 getter 方法而不是 setter 方法的 Rectangles 代码也是如此。