>>> 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 信任程序员。
>>> 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 信任程序员。
Guido对此的看法:
昨晚我想到了这一点,并意识到根本不应该允许你继承 bool !子类只有在它有实例时才有用,但是仅仅存在 bool 子类的实例就会破坏 True 和 False 是 bool 的唯一实例的不变性!(C 的子类的实例也是 C 的实例。)我认为不提供后门来创建额外的 bool 实例很重要,所以我认为 bool 不应该是可子类化的。
参考: http: //mail.python.org/pipermail/python-dev/2002-March/020822.html
由于OP在评论中提到:
我想
1 and 2
返回我的班级的一个实例。
我认为重要的是要指出这是完全不可能的:Python 不允许您更改内置类型(尤其是它们的特殊方法)。Literal1
将始终是 built-in type 的实例int
,并且在任何情况下,运算符的基本语义and
无论如何都不能被覆盖 -a and b
始终与for any and相同(不涉及强制,即使 OP 似乎错误地认为一个是发生)。b if a else a
a
b
bool
重申这个关键点: 的值a and b
永远不变a
,或者-b
没有办法打破这个语义约束(即使a
并且b
是你自己特殊类的实例 - 当然,当它们被约束为Python 内置的实例int
!-)。
这是解释该决定背后的原因的帖子:http: //mail.python.org/pipermail/python-dev/2004-February/042537.html
这个想法是bool
有一个特定的目的 - to beTrue
或 to be False
,并且添加它只会使您的代码在其他地方复杂化。
如果您使用的是 Python 3,并且希望有一个可以作为布尔值评估但还包含其他功能的类,__bool__
请在您的类中实现。
在 Python 2 中,可以通过实现__nonzero__
或__len__
(如果您的类是容器)来实现相同的效果。
因为bool
应该只有两个值 -True
和False
. 如果你能够子类bool
化,你可以为它定义任意数量的值,这绝对不是你想要发生的。
一个更好的问题是:为什么要扩展 bool?