self はクラスではなく、クラスのインスタンスを表します。
## まずは例を見てみましょう:
class Test: def prt(self): print(self) print(self.__class__) t = Test() t.prt()
<__main__.Test object at 0x000000000284E080> <class '__main__.Test'>
self と書くことはできませんか?
Python インタプリタ内で t.prt() を呼び出すと、Python は実際には Test.prt(t ) として解釈されます。つまり、self をクラスのインスタンスに置き換えます。 上記の t.prt() 行を書き直すと、実行後の実際の結果はまったく同じになります。 実は、定義時に self を省略できないことは部分的に説明されていますclass Test: def prt(): print(self) t = Test() t.prt()
Traceback (most recent call last): File "h.py", line 6, in <module> t.prt() TypeError: prt() takes 0 positional arguments but 1 was given
class Test: def prt(): print(__class__) Test.prt()
<class '__main__.Test'>
class Parent: def pprt(self): print(self) class Child(Parent): def cprt(self): print(self) c = Child() c.cprt() c.pprt() p = Parent() p.pprt()
<__main__.Child object at 0x0000000002A47080> <__main__.Child object at 0x0000000002A47080> <__main__.Parent object at 0x0000000002A47240>
説明:
いつ実行されるかを理解してはいけません。 c.cprt() を実行中です。質問は、Child クラスのインスタンスを指します。 ただし、c.pprt() を実行すると、Child.pprt(c) と同等になるため、self は依然として Child クラスのインスタンスを参照します。pprt() メソッドは self 内で定義されていないため、 そこで、継承ツリーを調べたところ、pprt() メソッドが親クラス Parent に定義されていることがわかり、このメソッドは正常に呼び出されます。概要
self は定義時に定義する必要がありますが、呼び出されたときに自動的に渡されます。 self の名前は規定されていませんが、規則に従って self を使用するのが最善です。self は、呼び出し時に常にクラスのインスタンスを参照します。以上がPythonではselfは冗長ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。