Pythonではselfは冗長ですか?

anonymity
リリース: 2019-06-14 16:18:57
オリジナル
2446 人が閲覧しました

self はクラスではなく、クラスのインスタンスを表します。

Pythonではselfは冗長ですか?

## まずは例を見てみましょう:


class Test:
  def prt(self):
    print(self)
    print(self.__class__)
  
t = Test()
t.prt()
ログイン後にコピー

実行結果は次のとおりです

<__main__.Test object at 0x000000000284E080>
<class &#39;__main__.Test&#39;>
ログイン後にコピー

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 &#39;__main__.Test&#39;>
ログイン後にコピー

継承する際に渡されるインスタンスは、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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート