クラスがその親クラスがサポートするいくつかの操作をサポートしていないことを示す方法が Python 3 にありますか?* クラスが に設定__hash__
しNone
て、型がハッシュ不可能であることを示すことができることは知っていますが、これは一般的には機能しないようです。
たとえば、__len__
メソッドを持つコレクション クラスがあり、サイズが定義されていない無制限のコレクションを表す子クラスを作成したいとします。サブクラスに設定__len__
するNone
と、コレクションの長さを取得しようとすると、醜い/混乱するエラーメッセージが表示されます。
>>> class C:
... def __len__(self):
... return 3
...
>>> class D(C):
... __len__ = None
...
>>> len(D())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
D
まったく定義されていないかのようにエラーが発生したいと思い__len__
ます。
>>> class E:
... pass
...
>>> len(E())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'E' has no len()
この質問は関連していますが、私の質問は特にマジックメソッド/演算子のオーバーロードに関するものです。Python のマジック メソッドはオブジェクトの型で直接検索されるため、オーバーライド__getattribute__
や記述子の使用などのいくつかの可能なアプローチは、ここでは機能しません。
*注: これがLiskov の置換原則に違反することはわかっていますが、型の安全性が必要な場合は、そもそも Python を使用していません。;)