集合庫提供抽象類及其子類,如MutableSequence
及其超類Sequence
。collections.abc中抽象方法的用途
在子類中抽象方法的必要性是什麼,然後被強制定義在從它們繼承的類中。爲什麼不能使用具體的方法呢?
集合庫提供抽象類及其子類,如MutableSequence
及其超類Sequence
。collections.abc中抽象方法的用途
在子類中抽象方法的必要性是什麼,然後被強制定義在從它們繼承的類中。爲什麼不能使用具體的方法呢?
那麼具體方法的執行方式是?
這些類的要點是而不是給你另一個列表對象。它們的存在是爲了傳達一個類需要實現哪些方法來遵守給定的協議。
對於容器ABC,它們本身不是容器;他們實際上沒有任何東西。所以你不能提供Sequence
的具體__getitem__
方法; 沒有內部狀態。並且提供一個使用_list
屬性的實現將決定子類如何實現這一點,但代理類僅僅是一個例子,它不會有內部的序列狀態。
,可以在其他的方法來表達,如__contains__
(回True
如果__getitem__
沒有引發異常)或__iter__
(只有方法,使用越來越指數和生產的__getitem__
結果直到拋出例外)具有子類化便利性的具體實現。
你能否將這個答案擴展到虛擬子類的目的?我的理解是虛擬子類被註冊到abstractclass/superclass作爲傳遞類型檢查的方式,例如isinstance或issubclass - 但爲什麼有人想要這樣做,爲什麼不創建一個真正的子類呢? –
@AranFreel:因爲你想測試*協議*。實現'__getitem__'和'__len__'的任何東西都可以在Python預期序列的任何地方使用。然而,這並不需要繼承。你*想要測試這些屬性,所以'isinstance(obj,Sequence)'是有價值的。 –
那麼他們的實施是什麼? –
PEP 3119中的基本原理是一個很好的信息源。 – VPfB