2017-10-01 3 views
0

Pythonインタプリタで、型の名前をxxxと入力すると、<class 'yyy'>のような出力が得られます。yyyxxxは同じではありません。次の例を参照してください。Pythonインタプリタでタイプ 'xxx`の出力' <class 'yyy'> 'をどのように理解できますか?

私はなぜyyyxxxが異なっているのだろうか、それぞれの意味は何ですか?ありがとう。

>>> builtins.staticmethod 
<class 'staticmethod'> 

>>> types.MethodType 
<class 'method'> 
>>> types.FunctionType 
<class 'function'> 
>>> types.BuiltinFunctionType 
<class 'builtin_function_or_method'> 
>>> types.BuiltinMethodType 
<class 'builtin_function_or_method'> 


>>> class C: 
...  pass 
... 
>>> C 
<class '__main__.C'> 

答えて

2

すべてのタイプはオブジェクトです。

strを適用することができます。型オブジェクトにstrを適用した結果は、ほんの一部の文字列にすぎません。たとえば、

>>> str(type(8)) 
"<class 'int'>" 
>>> str(type(abs)) 
"<class 'builtin_function_or_method'>" 
>>> str(type(lambda x: x + 1)) 
"<class 'function'>" 
>>> str(type((1,2,3))) 
"<class 'tuple'>" 
>>> str(type(90.4)) 
"<class 'float'>" 

strを実装するように設計されている人は誰でも好きです。あなたのCの例では、これらのほとんどが特定のパターンに従っています。

ここで、型はオブジェクトなので、変数に代入することができます。 割り当てられている変数は、適用時に表示される型名とは関係ありません。strです。たとえば、整数型がの変数builtins内に割り当てられたとします。ここではいくつかの例です:

>>> import builtins 
>>> builtins.int 
<class 'int'> 
>>> int 
<class 'int'> 
>>> float 
<class 'float'> 
>>> complex 
<class 'complex'> 
>>> list 
<class 'list'> 
>>> import types 
>>> types.FunctionType 
<class 'function'> 
>>> types.FunctionType == type(lambda x: x + 1) 
True 

私もこの

>>> integer = float 
>>> type(3.2) == integer 
True 

を行うではなく行うことができます。

TL; DR:1つはタイプに割り当てられた変数で、もう1つはstrの出力です。同じでなければならないというルールはありません。それらが異なるときは、型のデザイナーに尋ねなければなりません。

どのように関連付けることができるかに関しては、一般にはそうではありません。しかし、組み込み関数のほとんどは文字列出力と同じ名前になり、typesモジュールの型はCamelCaseの名前を大文字にしているようです。ユーザー定義型には、パッケージ名の前にクラス名が付いています。すべての場合にこの規則を遵守する必要があるかどうかはわかりません。

関連する問題