是否有任何规则有关其内置和标准库类不是子类化(“最终”)?
对于Python 3.3的,这里有几个例子:
-
bool
-
function
-
operator.itemgetter
-
slice
我发现了一个问题,这与“最终”类的实现的交易,无论是在C和纯Python。
我想了解什么原因可以解释为什么一个类被选定为在第一时间“最终”。
是否有任何规则有关其内置和标准库类不是子类化(“最终”)?
对于Python 3.3的,这里有几个例子:
bool
function
operator.itemgetter
slice
我发现了一个问题,这与“最终”类的实现的交易,无论是在C和纯Python。
我想了解什么原因可以解释为什么一个类被选定为在第一时间“最终”。
似乎有两个原因一类是在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
这是很神秘的,因为在这个问题上展示了许多问题。 我会提交建议增加一个段落,说明最后类的文档,甚至可能更改错误消息:
TypeError: type 'bool' is final (non-extensible)