77

の間に違いがあるかどうか疑問に思っています

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

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

?

どちらか一方を好む理由はありますか?

(私のユースケースでは、ロガー名を決定するために使用したいのですが、これは問題ではないと思います)

4

2 に答える 2

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

ですから、その二つは同じです。それが何であるかがより明白なので、私はそれを使用します。self.__class__

ただし、type(t)古いスタイルのクラスのインスタンスのinstance型は であるのに対し、新しいスタイルのクラス インスタンスの型はそのクラスであるため、古いスタイルのクラスでは機能しません。

>>> class Test(): pass
>>> t = Test()
>>> type(t) is t.__class__
False
>>> type(t)
instance
于 2012-04-30T15:26:26.550 に答える
6

私が知る限り、後者は前者のより良い方法です。

実際、Python ではそれほど珍しいことではありrepr(x)ませx.__repr__()ん。Python は、さまざまなクラスで使用する可能性が高い一般的な関数に組み込みを使用することを好み、通常はメソッドを呼び出すことによってこれらを実装します。len(x)x.__len__()__x__()

于 2012-04-30T15:26:23.733 に答える