0

selfこれらが何に使われているのか、特に議論がわかりませんか?これを私に説明してもらえますか、そしてなぜあなたはこれを渡したいのですか?

また、私はいつも__init__「初期化」のためだと思っていましたが、これまでここに何も入れる必要がなかったとは思いもしませんでした。誰かが私に簡単な例を教えてもらえますか?

self編集:関数などに渡されるのを見るたびに、私はとても混乱します。

4

3 に答える 3

18

selfメソッドを呼び出しているオブジェクトです。thisJavaの場合と少し似ています。

__init__オブジェクトを初期化するために作成されるときに、各オブジェクトで呼び出されます。これは、Javaのコンストラクターのようなものです。

したがって__init__、オブジェクトが作成されたときに、オブジェクトの属性(Javaのメンバー変数)を設定するときはいつでも使用します。「空の」オブジェクトに満足している場合はメソッドは必要ありませんが、__init__引数を使用してオブジェクトを作成する場合はメソッドが必要です。

例は次のとおりです。

class StackOverflowUser:
    def __init__(self, name, userid, rep): 
        self.name = name
        self.userid = userid
        self.rep = rep

dave = StackOverflowUser("Dave Webb",3171,500)

次に、作成したオブジェクトを確認できます。

>>> dave.rep
500
>>> dave.name
'Dave Webb'

したがって、作成されたオブジェクトへの参照である、__init__とともにコンストラクターに与えた引数が渡されることがわかります。self次にself、引数を処理してオブジェクトを適切に更新するときに使用します。

self他の言語がPythonを必要としないのに、なぜPythonが持っているのかという疑問があります。Python FAQによると:

メソッド定義と呼び出しで「self」を明示的に使用する必要があるのはなぜですか?

まず、ローカル変数の代わりにメソッドまたはインスタンス属性を使用していることがより明白です...

次に、特定のクラスからメソッドを明示的に参照または呼び出す場合は、特別な構文は必要ありません...

最後に、たとえば変数の場合、代入に関する構文上の問題を解決します。Pythonのローカル変数は(定義上!)関数本体で値が割り当てられる(そしてグローバルとして明示的に宣言されていない)変数であるため、代入はローカル変数ではなくインスタンス変数に代入することを意図しており、構文的であることが望ましいことをインタプリタに伝えるための何らかの方法(効率上の理由から)...

于 2009-11-20T11:11:41.633 に答える
3

慣例により、selfは、メソッドを呼び出しているオブジェクトのインスタンスです。

例えば:

class MyClass:
  """A simple example class"""
  def __init__(self):
    print "MyClass class created"
  i = 12345
  def f(self):
    return self.i

# Create an object called a of type MyClass. This will print "MyClass class created"
a = MyClass()

# Run the method - should return 12345
print a.f()

# Make another instance of the class to illustrate they are separate.
b = MyClass()
# Set a.i to another value.
a.i = 1

# Note the result
print a.f()
print b.f()

ちなみに、自分で呼ぶ必要はなく、好きなように呼ぶことができます。これは常に最初のパラメーターになります。

于 2009-11-20T11:17:22.713 に答える
2

これは、C ++/Javaの「this」パラメーターと考えてください。クラスのインスタンスを参照するために使用されます。

Class Whatever:   
  def __init__(self, some_parameter):   
    self.instance_parameter = some_parameter

__init__クラスインスタンスコンストラクタと考えてください。

于 2009-11-20T11:08:38.660 に答える