2017-08-22 22 views
1

組み込みタイプを調べると、何か変わったことに気付きました。NotImplementedTypeが型サブクラスではないのはなぜですか?

>>> from types import NotImplementedType 
>>> issubclass(NotImplementedType, type) 
False 
>>> type(NotImplementedType) 
<type 'type'> 

これらの2つのことはどのように真実になりますか?どのようにはtypeのサブクラスではないが、まだtypeから派生することができますか?

+3

を、そして 'のメタ型はNotImplementedType'は確か' type'がある:isinstance()使用(ほとんどの型はメタ型 'type'を持っています)。しかし、それはクラス自体が型のサブクラスであるという意味ではありません。 –

+1

この完全に正当な質問がなぜ下降しているのか分かりません – endolith

答えて

3

クラスはtypeのサブクラスではなく、types.NotImplementedTypeを含みます。 typeは、クラスのメタクラスです。例えば

、カスタムクラスとビルトインタイプはtypeいずれかのサブクラスではありません。

>>> class Foo: pass 
... 
>>> issubclass(Foo, type) 
False 
>>> issubclass(int, type) 
False 

だけ他のメタクラスはtypeのサブクラスです。 ABCMetaメタクラスのように:

>>> from abc import ABCMeta 
>>> issubclass(ABCMeta, type) 
True 

これはintancesとクラスに似ています。インスタンスはそのクラスのサブクラスではありません。あなたは*メタ型*を得る `(..)` `タイプにタイプ(..)`使用することにより

>>> issubclass(Foo(), Foo) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: issubclass() arg 1 must be a class 
>>> isinstance(Foo(), Foo) 
True 
>>> import types 
>>> isinstance(types.NotImplementedType, type) 
True 
+0

私はダウンボートに値するために、私の答えについて何か助けになるか間違っているか聞きたいです。そうすれば私は自分の答えを改善することができます! –

関連する問題