2

在 Python 中,是否可以获取一个类并删除其成员函数之一?即:A类有7个成员函数。其他五个类继承自类 A。现在,假设其中一个类不想要类 A 的成员函数之一。有没有办法保持该功能的出现?

4

2 回答 2

1

现在,假设其中一个类不需要 A 类的成员函数之一。有没有办法保持该功能的出现?

__dir__方法允许您控制“显示”哪些方法。它不会禁用该方法,它只是允许您控制所看到的内容。

理想情况下,这种努力应该伴随着覆盖有问题的方法并让它引发NotImplementedError(例如,这是 Python 的collections.Counter.fromkeys()方法中使用的方法。

根据方法的不同,还有其他禁用它的方法。例如,可以通过将继承的 __hash__ 方法设置为None来禁用它(例如,这是在集合抽象基类中使用的方法,例如collections.Mapping)。

于 2013-04-21T01:06:06.510 回答
0

一般来说,您不应该在子类中删除部分基类的 API。这是因为继承的要点之一是子类实例是基类的实例。如果他们缺少方法,事情可能会以尴尬的方式打破。

也就是说,如果调用不合适,有时可以覆盖继承的方法并引发异常。这可能只是在参数不是子类需要的情况下,但在某些情况下它可能适用于所有调用。不过,请尝试使异常有用,因为程序员AttributeError在调用已记录的方法时遇到意外或其他常见错误是没有乐趣的。

这是一个子类的示例,它覆盖了其超类的部分 API 以禁止其使用。请注意,我使用的是 getter 和 setter 方法,这通常不是很 Pythonic,但易于理解(最好使用propertys)。

基类:

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 代码也是如此。

于 2013-04-21T01:10:43.353 回答