Python改变类函数

时间:2013-04-21 00:45:06

标签: python class

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

2 个答案:

答案 0 :(得分:1)

  

现在,说其中一个类不想要A类成员之一   功能。有没有办法让这个功能出现?

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

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

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

答案 1 :(得分:0)

一般来说,您不应该删除子类中基类的API的一部分。这是因为其中一个继承点是子类的实例是基类的实例。如果他们缺少方法,那么东西可能会以尴尬的方式破裂。

也就是说,有时候覆盖一个继承的方法并在调用不合适时引发异常是合适的。这可能仅在参数不是子类所需的参数时才有效,但在某些情况下,它可能适用于所有调用。尽量让异常变得有用,因为在调用文档化的方法时,程序员在获取意外的AttributeError或其他常见错误时会感到很有趣。

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

基类:

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方法。