为什么我不能在Python中扩展bool?

时间:2010-01-31 15:22:39

标签: python boolean restriction

>>> 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信任程序员。

5 个答案:

答案 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 aab强制而言,强>总是与bool相同,即使OP似乎错误地认为一件事正在发生。)

重申这一关键点:a and b的值总是,不变的 ab - 没有打破这种语义约束的方法(即使ab是你自己的特殊类的实例 - 当然,当它们被限制为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应该只有两个值 - TrueFalse。如果你能够继承bool,你可以为它定义任意数量的值,这绝对不是你想要发生的。

更好的问题是:你为什么要扩展布尔?