我試圖弄清楚什麼是在Python中繼承原則的最佳實踐,當在子中更改方法簽名時存在「壞主意」。繼承:更改子方法的簽名
讓我們假設我們有一些基礎類BaseClient
與已經實施的create
方法(和一些抽象的)適合適合幾乎所有的「後代」,除了一個:
class BaseClient(object):
def __init__(self, connection=None):
pass
def create(self, entity_id, data=None):
pass
class ClientA(BaseClient):
pass
class ClientB(BaseClient):
pass
中唯一的類ClientC
需要的另一種實現方式create
方法帶有一點點的另一種方法簽名
class ClientC(BaseClient):
....
def create(self, data):
pass
所以現在的問題是如何使這個更「Python化」的方式,考慮到最好蟒蛇的做法?當然,我們可以在父(子)方法中使用*args, **kwargs
和其他**kwargs
類似的方法,但是恐怕它會使我的代碼不易讀(自我記錄)。
替換原理:通常不是一個好的設計,它有一個不能做基類的子類 - 'x.create(entity_id)'適用於'BaseClient',因此它應該適用於它的子類。 – zch
爲什麼ClientC需要另一個創建實現? – Gribouillis
什麼zch說:一個子類型可以添加新的參數方法簽名,但它不應該刪除它們,因爲它違反[Liskov替代原則](https://en.wikipedia.org/wiki/Liskov_substitution_principle)。 –