>>> class BOOL(bool):
... print "why?"
...
why?
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
type 'bool' is not an acceptable base type
我认为Python信任程序员。
答案 0 :(得分:46)
Guido对此的看法:
我最后想到了这一点 晚上,意识到你不应该 被允许继承子类bool!一个 子类只有在它时才有用 有实例,但仅仅存在 bool的子类的实例 会破坏True的不变量 和False是唯一的例子 布尔! (C的子类的实例 也是C的一个例子。)我想 重要的是不要提供 后门创建额外的布尔 实例,所以我认为bool不应该 是可继承的。
参考:http://mail.python.org/pipermail/python-dev/2002-March/020822.html
答案 1 :(得分:10)
由于OP在评论中提及:
我希望
1 and 2
返回一个实例 我班上的。
我认为重要的是要指出这是完全不可能的:Python不会让你改变内置类型(特别是它们的特殊方法)。文字1
将始终是内置类型int
的实例,无论如何,and
运算符的基本语义无法覆盖 - a and b
是<对于任何 b if a else a
和a
(b
强制而言,强>总是与bool
相同,即使OP似乎错误地认为一件事正在发生。)
重申这一关键点:a and b
的值总是,不变的 a
或b
- 没有打破这种语义约束的方法(即使a
和b
是你自己的特殊类的实例 - 当然,当它们被限制为Python的内置{{{ 1}} - !)
答案 2 :(得分:9)
以下是解释决定背后原因的帖子:http://mail.python.org/pipermail/python-dev/2004-February/042537.html
我们的想法是bool
有一个特定的目的 - 成为True
或成为False
,并且添加到其他内容只会使您的代码复杂化。
答案 3 :(得分:6)
如果您使用的是Python 3,并且希望有一个可以作为布尔值计算的类,但也包含其他功能,请在您的类中实现__bool__
。
在Python 2中,通过实现__nonzero__
或__len__
(如果您的类是容器)可以实现相同的效果。
答案 4 :(得分:4)
因为bool
应该只有两个值 - True
和False
。如果你能够继承bool
,你可以为它定义任意数量的值,这绝对不是你想要发生的。
更好的问题是:你为什么要扩展布尔?