2012-04-30 10 views
48

パイソン:自己.__ class__対タイプ(自己)

class Test(object): 
    def __init__(self): 
     print self.__class__.__name__ 

class Test(object): 
    def __init__(self): 
     print type(self).__name__ 

に差がある場合、私は思ったんだけど?

いずれかの理由がありますか?

(私のユースケースでは、私は、ロガー名を決定するためにそれを使用したいが、私は、これは問題ではありません推測)

+5

[(obj)とobj。(_st_overflow.com/questions/1060499/difference-between-typeobj-and-obj-class)のタイプの差[ – user

+0

@ Python 3では特定の状況下でそれらの間に違いがあります(Flavienの[answer](http://stackoverflow.com/a/10633356/704244)を参照) –

答えて

31
>>> class Test(object): pass 
>>> t = Test() 
>>> type(t) is t.__class__ 
True 
>>> type(t) 
__main__.Test 

したがって、これらの2つは同じです。 self.__class__を使用するのは、それがより明白だからです。

>>> class Test(): pass 
>>> t = Test() 
>>> type(t) is t.__class__ 
False 
>>> type(t) 
instance 
:古いスタイルのクラスのインスタンスのタイプは instanceであるため、新しいスタイルのクラスのインスタンスの型はそのクラスである一方、

しかし、type(t)は古いスタイルのクラスのために動作しません。

+9

本当に? 'self(self)'に 'self .__ class__'にアクセスしますか?後者がより明確で、型が少なく、一貫性があると思います。len([1、2、3])に対して '[1,2,3] .__ len __()'を実行することはできません。 –

+9

まあ 'len()'はあなたに何をしているのかを教えてくれますが、 'type(self)'はすぐに "あなたにクラスを与えます"とは言わない – ThiefMaster

+5

Python、Type、Classの初期のバージョンはPythonでは同義です。私はそれが本当にそれを見ていない。 –

4

私の知る限り、後者はやってのちょうどよりよい方法です。前者。

それはちょうどx.__len__()を呼び出すだけx.__repr__()またはlen(x)を呼び出す、repr(x)を検討し、Pythonで実際には珍しいことではありません。 Pythonは、ある範囲のクラスで使用する可能性が高い共通関数用の組み込み関数を使用することを好みます。通常は、__x__()メソッドを呼び出すことで実装します。