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

4

5 回答 5

57

Guido对此的看法:

昨晚我想到了这一点,并意识到根本不应该允许你继承 bool !子类只有在它有实例时才有用,但是仅仅存在 bool 子类的实例就会破坏 True 和 False 是 bool 的唯一实例的不变性!(C 的子类的实例也是 C 的实例。)我认为不提供后门来创建额外的 bool 实例很重要,所以我认为 bool 不应该是可子类化的。

参考: http: //mail.python.org/pipermail/python-dev/2002-March/020822.html

于 2010-01-31T15:27:10.307 回答
12

由于OP在评论中提到:

我想1 and 2返回我的班级的一个实例。

我认为重要的是要指出这是完全不可能的:Python 不允许您更改内置类型(尤其是它们的特殊方法)。Literal1将始终是 built-in type 的实例int,并且在任何情况下,运算符的基本语义and无论如何都不能被覆盖 -a and b始终与for any and相同(不涉及强制,即使 OP 似乎错误地认为一个是发生)。b if a else a abbool

重申这个关键点: 的值a and b永远不变a,或者-b没有办法打破这个语义约束(即使a并且b是你自己特殊类的实例 - 当然,当它们被约束为Python 内置的实例int!-)。

于 2010-01-31T18:03:42.553 回答
9

这是解释该决定背后的原因的帖子:http: //mail.python.org/pipermail/python-dev/2004-February/042537.html

这个想法是bool有一个特定的目的 - to beTrue或 to be False,并且添加它只会使您的代码在其他地方复杂化。

于 2010-01-31T15:25:07.660 回答
9

如果您使用的是 Python 3,并且希望有一个可以作为布尔值评估但还包含其他功能的类,__bool__请在您的类中实现。

在 Python 2 中,可以通过实现__nonzero____len__(如果您的类是容器)来实现相同的效果。

于 2010-01-31T15:30:15.903 回答
3

因为bool应该只有两个值 -TrueFalse. 如果你能够子类bool化,你可以为它定义任意数量的值,这绝对不是你想要发生的。

一个更好的问题是:为什么要扩展 bool?

于 2010-01-31T15:26:15.203 回答