6

typeそれがすべてのクラスのスーパークラスであることを考えると、なぜisinstance(1, type)ですか False? 概念を間違って理解していますか?

4

2 に答える 2

12

typeすべてのクラスのスーパークラスではありません。これは、(カスタム メタクラスを持たない) すべてのクラスの型です。違いに注意してください。

>>> isinstance(1, int)
True
>>> isinstance(1, type)
False
>>> isinstance(int, type)
True

数値 1 は型のインスタンスではありません。むしろ、int型自体が のインスタンスですtype

編集:

これらの例はあなたを助けるかもしれません:

>>> isinstance(1, int)
True
>>> issubclass(1, int)
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    issubclass(1, int)
TypeError: issubclass() arg 1 must be a class
>>> class Foo(object):
...     pass
>>> isinstance(Foo, type)
True
>>> issubclass(Foo, type)
False # Note the difference from the previous!
>>> isinstance(Foo, object)
True
>>> issubclass(Foo, object)
True
>>> isinstance(int, type)
True
>>> issubclass(int, type)
False # Note the difference from the previous!

あなたのコメントから、継承がどのように機能するかを誤解しているようです。型のインスタンスであることと、型のサブクラス (またはサブタイプ) であることには違いがあります。オブジェクト X が型 A のインスタンスであり、型 A が型 B のサブクラスである場合、X は B のインスタンスでもあります。ただし、型 A が型 B のインスタンスである場合、X は B のインスタンスではありません。言い換えれば、サブクラスは推移的ですが、インスタンスはそうではありません。

現実世界の例えは、「種」と「ホモ・サピエンス」のようなものです。「種」はタイプであり、「ホモ・サピエンス」はそのタイプのインスタンスであると言えます。つまり、「ホモ・サピエンス」は特定の種です。しかし、「ホモ・サピエンス」もタイプであり、個々の人間はそのタイプのインスタンスです。たとえば、バラク・オバマ (よく知られた例を挙げると) は「ホモ・サピエンス」の例です。つまり、彼は特定のホモサピエンスです。しかし、バラク・オバマは種の例ではありません。彼自身は種ではありません。

type、 、および数字の 1の関係intも同様です。数値 1 は のインスタンスでありintintのインスタンスですがtype、それは 1 が型のインスタンスであることを意味しません。

于 2012-08-25T17:57:32.110 に答える
4

これtypeは、すべての組み込み型のスーパータイプではないためです。objectは。

于 2012-08-25T17:50:41.617 に答える