max*_*max 71 python inheritance language-design class python-3.x
是否有关于哪些内置和标准库类不可子类化("最终")的规则?
从Python 3.3开始,这里有几个例子:
bool
function
operator.itemgetter
slice
我发现了一个问题,它涉及C语言和纯Python中"final"类的实现.
我想了解是什么原因可以解释为什么一个班级被选为首选的"最终".
max*_*max 26
在Python中,类似乎有两个"最终"的原因.
1.违反类不变量
遵循Singleton模式的类具有不变量,即具有有限(预定)数量的实例.在子类中违反此不变量将与类的意图不一致,并且无法正常工作.例子:
bool
:True
,False
; 看看圭多的评论NoneType
: None
NotImplementedType
: NotImplemented
ellipsis
: Ellipsis
在此类别中可能存在除Singleton模式之外的情况,但我不知道任何情况.
2.没有说服力的用例
用C实现的类需要额外的工作来允许子类化(至少在CPython中).在没有令人信服的用例的情况下进行此类工作并不是很有吸引力,因此志愿者不太可能挺身而出.例子:
function
; 看蒂姆彼得斯的帖子注1:
我原本以为有有用的用例,但只是没有足够的兴趣,在子类化function
和operator.itemgetter
.感谢@agf指出此处和此处提供的用例并不令人信服(请参阅@agf评论问题).
笔记2:
我担心的是另一个Python实现可能会意外地允许子类化CPython中的最终类.这可能导致不可移植的代码(用例可能很弱,但是function
如果Python支持它,有些人仍然可能编写子类的代码).这可以通过在Python文档中标记所有无法子类化的内置和标准库类来解决,并要求所有实现都遵循这方面的CPython行为.
注3:
CPython在上述所有情况下产生的消息是:
TypeError: type 'bool' is not an acceptable base type
Run Code Online (Sandbox Code Playgroud)
这是非常神秘的,因为关于这个主题的许多问题都表明了.我将提交一个建议,在解释最终类的文档中添加一个段落,甚至可能将错误消息更改为:
TypeError: type 'bool' is final (non-extensible)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6247 次 |
最近记录: |