2017-04-08 57 views
0

集合庫提供抽象類及其子類,如MutableSequence及其超類Sequencecollections.abc中抽象方法的用途

在子類中抽象方法的必要性是什麼,然後被強制定義在從它們繼承的類中。爲什麼不能使用具體的方法呢?

+1

那麼他們的實施是什麼? –

+0

PEP 3119中的基本原理是一個很好的信息源。 – VPfB

回答

1

那麼具體方法的執行方式是

這些類的要點是而不是給你另一個列表對象。它們的存在是爲了傳達一個類需要實現哪些方法來遵守給定的協議。

對於容器ABC,它們本身不是容器;他們實際上沒有任何東西。所以你不能提供Sequence的具體__getitem__方法; 沒有內部狀態。並且提供一個使用_list屬性的實現將決定子類如何實現這一點,但代理類僅僅是一個例子,它不會有內部的序列狀態。

,可以在其他的方法來表達,如__contains__True如果__getitem__沒有引發異常)或__iter__只有方法,使用越來越指數和生產的__getitem__結果直到拋出例外)具有子類化便利性的具體實現。

+0

你能否將這個答案擴展到虛擬子類的目的?我的理解是虛擬子類被註冊到abstractclass/superclass作爲傳遞類型檢查的方式,例如isinstance或issubclass - 但爲什麼有人想要這樣做,爲什麼不創建一個真正的子類呢? –

+1

@AranFreel:因爲你想測試*協議*。實現'__getitem__'和'__len__'的任何東西都可以在Python預期序列的任何地方使用。然而,這並不需要繼承。你*想要測試這些屬性,所以'isinstance(obj,Sequence)'是有價值的。 –