“我怎么能?”;“未定义”;子类上的Python魔术方法?

“我怎么能?”;“未定义”;子类上的Python魔术方法?,python,python-3.x,operator-overloading,liskov-substitution-principle,python-datamodel,Python,Python 3.x,Operator Overloading,Liskov Substitution Principle,Python Datamodel,在Python3中有没有一种方法可以表示一个类不支持其父类支持的某些操作?*我知道类可以将\uuuuuu hash\uuuuu设置为None来表示一个类型是不可损坏的,但这在一般情况下似乎不起作用 例如,假设我有一个集合类,它有一个\uuuu len\uuuu方法,我想创建一个子类来表示一个没有定义大小的无界集合。如果我在子类中将\uuu len\uu设置为None,当我尝试获取集合的长度时,会收到一条丑陋/混乱的错误消息 >>> class C: ... def __

在Python3中有没有一种方法可以表示一个类不支持其父类支持的某些操作?*我知道类可以将
\uuuuuu hash\uuuuu
设置为
None
来表示一个类型是不可损坏的,但这在一般情况下似乎不起作用

例如,假设我有一个集合类,它有一个
\uuuu len\uuuu
方法,我想创建一个子类来表示一个没有定义大小的无界集合。如果我在子类中将
\uuu len\uu
设置为
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
是相关的,但是我的问题特别涉及魔术方法/运算符重载。由于Python魔术方法是直接在对象的类型上查找的,因此一些可能的方法,如重写
\uuu getattribute\uuu
或使用描述符,在这里不起作用

*注意:我知道这会违反规范,但如果我想要类型安全,我就不会首先使用Python

我不想“取消定义”,因为那样可能会让它更混乱。我将明确并定制一条
TypeError
消息,说明此集合不支持
\uuu len\uuu
的原因:

class D(C):
    def __len__(self):
        raise TypeError("Unbounded collection defines no __len__")

为什么不从子级
引发NotImplementedError
?还要注意的是,动态类型与创建一个不完整的类结构不同;你能解释一下为什么你认为你需要这个吗?
class D(C):
    def __len__(self):
        raise TypeError("Unbounded collection defines no __len__")