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は常に組み込みの type のインスタンスであり、いずれにせよ、演算子intの基本的なセマンティクスはとにかくオーバーライドできません --は常にfor any and と同じです(たとえ OP が誤って 1 であると信じているように見えても、強制は含まれません)。ハプニング)。anda and bb 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 beFalseであり、それに追加すると、コードが他の場所で複雑になるだけです。

于 2010-01-31T15:25:07.660 に答える
9

Python 3 を使用していて、ブール値として評価できるが他の機能も含むクラスが必要な場合は、クラスに実装__bool__します。

__nonzero__Python 2 では、 orを実装することで同じ効果を得ることができ__len__ます (クラスがコンテナーの場合)。

于 2010-01-31T15:30:15.903 に答える
3

にはとboolの 2 つの値しかないはずだからです。をサブクラス化できた場合、任意の数の値を定義できますが、それは絶対に望んでいないことです。TrueFalsebool

より良い質問は、なぜ bool を拡張したいのですか?

于 2010-01-31T15:26:15.203 に答える