Python3 中有没有办法指示一个类不支持其父类支持的某些操作?* 我知道类可以将__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。 ;)
我不会寻求"取消定义"它,因为这可能会使它更加混乱。我会明确并为其定制一条TypeError
消息,说明为什么此集合不支持__len__
:
class D(C):
def __len__(self):
raise TypeError("Unbounded collection defines no __len__")