9

__class__クラス内に新しいインスタンスを作成するために使用するのは良い考えですか?

次のコードは、これを行う例です。

from collections import namedtuple

_Position = namedtuple('Position', ['x', 'y'])
class Position(_Position):
    def __add__(self, other):
        return __class__(self.x + other.x, self.y + other.y)

実際のクラス名を使用することは、私には重複したコードのように聞こえます。クラスの名前が変更された場合、最新のIDEで変更できる場合でも、すべての場面で名前を変更する必要があります。

ところで。どんな変数__class__ですか?でしかアクセスできないのではないですself.か?

4

1 に答える 1

16

のゼロ引数形式をサポートするために、またはがクラスメソッドで使用されているsuper()場合、コンパイラはクラスへの暗黙的な参照を追加します。クラスオブジェクトの作成を参照してください。__class__super()

見つけたサンプルコード(ab)は、この小さなファクトイドを使用してPosition、追加時にの新しいインスタンスを作成します。

個人的には、type(self)代わりに使用します。これは、オブジェクトのタイプまたはクラスを判別するための適切なAPIメソッドです。type(self)必要に応じて使用self.__class__します:

def __add__(self, other):
    return type(self)(self.x + other.x, self.y + other.y)

サブクラス化をサポートする場合は、これお勧めします。のサブクラスは、Position一緒に追加されると正しいサブクラス化されたタイプを返します。サブクラスの場合でも、常にを指しているため、を使用してもそれは行われ__class__ません。Position

>>> class Foo:
...     def method(self):
...         print(__class__)
...         print(type(self))
... 
>>> class Bar(Foo):
...     pass
... 
>>> Bar().method()
<class '__main__.Foo'>
<class '__main__.Bar'>

もちろん、それが(サブクラスをバイパスするための)ずっとあなたの意図であった場合でも、;を使用するよりも明示的なクラス名を使用する方が好き__class__です。明示的は暗黙的よりも優れています。

于 2013-01-01T17:08:10.670 に答える