2013-04-21 66 views
2

在Python中,是否可以接受一個類並刪除它的一個成員函數?即:A類有7個成員職能。其他五個類繼承自A類。現在,假設其中一個類不需要類A的成員函數之一。有沒有辦法讓這個功能保持顯示?Python更改類功能

+3

聽起來更像是你需要商定現有的實現 – Bryan 2013-04-21 00:46:41

+0

重新考慮您的實現/設計比淤泥,這不是專門在Python支持,因爲你不應該擺在首位那樣做! – jamylak 2013-04-21 00:48:53

+0

@jamylak問題是,頂部的答案實際上是錯誤的... – JBernardo 2013-04-21 00:50:43

回答

1

現在,假設這些類的一個不希望的類A的成員 功能之一。有沒有辦法讓這個功能保持顯示?

__dir__ method可讓您控制哪些方法「顯示」。它不會禁用該方法,它只是允許您控制所看到的內容。

理想的情況下,這種努力應該通過重寫問題的方法,並讓它提高NotImplementedError陪同(例如,這是Python的collections.Counter.fromkeys()方法所使用的方法。

根據不同的方法,也有其他的方法禁用它。例如,一個繼承__hash__方法可以通過將其設置到禁用(例如這是一種利用在集合抽象基類如collections.Mapping的方法)。

0

一般來說,你不應該刪除子類中的一部分基類的API。這是因爲一個o f繼承點是子類的實例是基類的實例。如果他們缺少方法,東西可能會以尷尬的方式破裂。

也就是說,重寫一個繼承的方法以及在調用不合適時引發異常是偶爾適當的。這可能只有當參數不是子類所需要的,但在某些情況下,它可能適用於所有的調用。儘管如此,嘗試使異常很有幫助,因爲在調用記錄的方法時,程序員得到意想不到的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方法。