Pythonではselfは冗長ですか?

Jun 14, 2019 pm 04:18 PM
python

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

Pythonでは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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

テンプレートのメリットとデメリットは何ですか? テンプレートのメリットとデメリットは何ですか? May 08, 2024 pm 03:51 PM

テンプレートのメリットとデメリットは何ですか?

Deepseek Xiaomiをダウンロードする方法 Deepseek Xiaomiをダウンロードする方法 Feb 19, 2025 pm 05:27 PM

Deepseek Xiaomiをダウンロードする方法

Google AI、開発者向けに Gemini 1.5 Pro と Gemma 2 を発表 Google AI、開発者向けに Gemini 1.5 Pro と Gemma 2 を発表 Jul 01, 2024 am 07:22 AM

Google AI、開発者向けに Gemini 1.5 Pro と Gemma 2 を発表

わずか 250 ドルで、Hugging Face のテクニカル ディレクターが Llama 3 を段階的に微調整する方法を教えます わずか 250 ドルで、Hugging Face のテクニカル ディレクターが Llama 3 を段階的に微調整する方法を教えます May 06, 2024 pm 03:52 PM

わずか 250 ドルで、Hugging Face のテクニカル ディレクターが Llama 3 を段階的に微調整する方法を教えます

いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する May 06, 2024 pm 04:43 PM

いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する

golang 関数のデバッグと分析の完全ガイド golang 関数のデバッグと分析の完全ガイド May 06, 2024 pm 02:00 PM

golang 関数のデバッグと分析の完全ガイド

どうやって彼にdeepseekに尋ねますか どうやって彼にdeepseekに尋ねますか Feb 19, 2025 pm 04:42 PM

どうやって彼にdeepseekに尋ねますか

評価関数の保存方法 評価関数の保存方法 May 07, 2024 am 01:09 AM

評価関数の保存方法

See all articles