1

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。;)

4

1 回答 1

1

我不会寻求“取消定义”它,因为这可能会使它更加混乱。我会明确并为其定制一条TypeError消息,说明此集合不支持的原因__len__

class D(C):
    def __len__(self):
        raise TypeError("Unbounded collection defines no __len__")
于 2017-02-20T10:47:12.077 回答