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

Jua*_*nti 26 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
Run Code Online (Sandbox Code Playgroud)

我以为Python信任程序员.

Max*_*keh 48

圭多的看法:

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

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

  • 单身是真是假.这是一个更好的答案. (14认同)
  • 试图理解这个答案:从“bool”继承不会以任何方式影响“True”和“False”的不变性。子类的实例仍然是“True”或“False”(从“bool”角度来看)。它可能具有其他属性,并且如果您覆盖`__eq__()`,则可能等于也可能不等于其中之一,但否则它不会对`bool`或其两个可能值产生负面影响。我缺少什么? (2认同)

Ale*_*lli 10

由于OP在评论中提到:

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

我认为重要的是要指出这完全是不可能的:Python不允许你改变内置类型(特别是它们的特殊方法).文字1永远是内置式的实例int,并在任何情况下的基本语义and运营商是不可重写反正- a and b始终一致b if a else a任何 ab(不bool涉及强制,即使OP似乎误认为是一个发生).

重申这关键的一点:价值a and b永远,不变地要么ab-有没有办法打破这种语义约束(即使ab是你自己独特的类的实例-就更少了,当然,当他们被限制为Python内置的实例int! - ).


dan*_*ben 9

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

这个想法是bool有一个特定的目的 - 成为True或将要False添加,只会使你的代码复杂化.


AJ.*_*AJ. 7

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

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

  • 在Python 2.x中,你可以通过实现`__nonzero__`或`__len__`来做同样的事情. (3认同)
  • 首先继承bool,然后重写int方法......为什么不从头开始创建自己的类? (2认同)