ホームページ >バックエンド開発 >Python チュートリアル >Pythonではselfは冗長ですか?
self はクラスではなく、クラスのインスタンスを表します。
## まずは例を見てみましょう:
class Test: def prt(self): print(self) print(self.__class__) t = Test() t.prt()実行結果は次のとおりです
<__main__.Test object at 0x000000000284E080> <class '__main__.Test'>From 上記の例から、self がクラスのインスタンスを表すことは明らかです。そして self.class はクラスを指します。
self と書くことはできませんか?
Python インタプリタ内で t.prt() を呼び出すと、Python は実際には Test.prt(t ) として解釈されます。つまり、self をクラスのインスタンスに置き換えます。 上記の t.prt() 行を書き直すと、実行後の実際の結果はまったく同じになります。 実は、定義時に self を省略できないことは部分的に説明されていますclass Test: def prt(): print(self) t = Test() t.prt()実行時のリマインダーエラーは次のとおりです: prt には定義時にパラメータがありませんが、定義時にパラメータが強制的に渡されます。ランタイム。 上で説明したように、t.prt() は Test.prt(t) と同等であるため、プログラムはもう 1 つのパラメーター t が渡されることを思い出させます。
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'>継承する際に渡されるインスタンスは、selfが定義されているクラスのインスタンスではなく、渡されたインスタンスになります。 最初にコードを見てください
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 サイトの他の関連記事を参照してください。