>>> 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
class Foo(None.__class__): ...
-> TypeError: type 'NoneType' is not an acceptable base type
- Wayne Wernerbool
继承不会以任何方式影响True
和False
的不变性。子类的实例仍然是True
或False
(从bool
的角度来看)。如果您覆盖了__eq __()
,则它可能具有其他属性并且可能与其中一个相等,但否则它不会对bool
或其两个可能值产生负面影响。我错过了什么? - user3204459if b and isinstance(b, bool) then b is True
。这将导致您的代码跟随库设计人员不打算的路径,并使语言感觉不稳定。 - flakesif not b and isinstance(b, int) then b is 0
,其中一个类继承自 int
)。那么 bool
有什么特别之处呢?从 bool
继承不应该破坏任何东西,一切仍将按照其预期进行。==
将调用 __eq__()
,而 is
将检查标识,因此使用正确运算符的人将获得正确的行为。使用标识而不是相等或反之似乎是禁止编程语言中某些任意事物的奇怪原因,因为任何东西都可能被误用。 - user3204459__bool__
方法。__nonzero__
或__len__
(如果你的类是一个容器)来实现相同的效果。__nonzero__
或__len__
来完成相同的操作。 - Max Shawabkeh由于OP在评论中提到:
我希望
1和2
返回我的类的一个实例。
我认为重要的是指出这是完全不可能的:Python不允许您更改内置类型(特别是它们的特殊方法)。 字面值1
将始终是内置类型int
的实例,而且无论如何,and
运算符的基本语义都不能被覆盖 - 对于任何a
和b
,a and b
始终等同于b if a else a
(没有bool
强制转换,尽管OP似乎错误地认为正在发生一种转换)。
重申这个关键点: a and b
的值始终是a
或b
,不能改变这种语义约束(即使a
和b
是您自己奇特类的实例 - 当然当它们被限制为Python的内置int
的实例时就更加不可能了!-)。
bool
有一个特定的目的 - 要么是 True
要么是 False
,在此基础上添加其他内容只会使你的代码变得更加复杂。bool
只有两个值——True
和 False
。如果您能够对 bool
进行子类化,就可以为其定义任意数量的值,这绝对不是您想要发生的事情。bool
进行子类化。True
和False
是bool
的唯一实例的不变性。但事实并非如此:>>> class BOOL:
... @property
... def __class__(self):
... return bool
...
>>> FileNotFound = BOOL()
>>> isinstance(FileNotFound, bool)
True
>>>
__class__
的这种行为是文档化并在标准库中使用。isinstance(x, bool)
是x is True or x is False
的安全等价物,但事实并非如此。type(x) is T
,而不是isinstance(x, T)
,无论如何。即使它们在bool
的情况下等效(即使它们成功做到了),也只会鼓励编写在那种情况下无法清晰表达意图的代码。type(FileNotFound)
是 BOOL
,而不是 bool
,所以确切类型的测试在这里有效。我猜想,一个恶意行为者可能会替换 type
。一般来说,在Python中期望任何形式的不变量都是愚蠢的行为。)