私が読んだ/理解していることから、「self」パラメーターは「this」に似ています。
本当?
オプションの場合、self がメソッドに渡されなかったらどうしますか?
はい、似たような使い方です。これは位置パラメータであり、必要に応じて呼び出すことができることに注意してください。ただし、それを呼び出すための強力な規則がありますself
(notthis
または何か他のもの)。使用可能なインスタンス メソッドには、位置パラメータが必要です。オプションではありません。
パイソンの喜び
それはある意味で真実です。メソッドは、その一部であるオブジェクト インスタンスにバインドされます。あなたが見るとき
def some_func(self, foo, bar)
たとえば、次のように、呼び出し時に self の受け渡しが暗黙的に行われることがあります。
obj.some_func(foo_val, bar_val)
どちらが等しいか (obj
クラス であると仮定MyClass
)
MyClass.some_func(obj, foo_val, bar_val)
メソッドは にバインドされているためobj
、self
引数が取り込まれます。これは、Python が意味することを明示することの一部です。他の言語では、this
スコープに飛び込むだけですが、Python では、これがどのように発生するかが明らかになります。
self
メソッドを渡したり、バインドされたコンテキストから呼び出していないときに手動で渡すこともできます。
xf = x.f
while True:
print xf()
時間の終わりまで hello world を出力し続けます。
メソッドが呼び出されると、正確には何が起こりますか? f() の関数定義で引数が指定されていても、上記の引数なしで xf() が呼び出されたことに気付いたかもしれません。口論はどうした?確かに、引数を必要とする関数が引数なしで呼び出されると、Python は例外を発生させます — 引数が実際に使用されていなくても...
実際、あなたは答えを推測したかもしれません: メソッドの特別な点は、オブジェクトが関数の最初の引数として渡されることです。この例では、呼び出し xf() は MyClass.f(x) とまったく同じです。一般に、n 個の引数のリストを使用してメソッドを呼び出すことは、最初の引数の前にメソッドのオブジェクトを挿入することによって作成される引数リストを使用して対応する関数を呼び出すことと同じです。
self
is ですthis
。明示的に渡し、明示的に使用してクラスのメソッド/プロパティを参照するだけです。
クラスメソッドではオプションではありません。TypeError
少なくとも 1 つの引数 (つまり、self
パラメーター)なしでクラスメソッドを定義しようとすると、が返されます。
ただし、 以外の呼び方もできますが、それ以外self
は見たことがありません。
self
は間違いなく似ていますがthis
、Pythonでは、名前self
は単なる慣例であり、他の名前を付けることができます。変数の名前は、関数のプロトタイプ()で呼び出したものにちなんで付けられますdef function(whatever, params...):
。
たとえば、メソッドはself
実際に必要です。クラスメソッドまたは静的メソッドの場合、それらをそのように扱う必要があることを指定する必要があります。そうすれば、self
必須ではありません。例えば:
def type_to_display(type):
"""Converts a pass type to the full written pass type."""
return list((pair[1] for pair in Pass.TYPE_CHOICES if pair[0] ==
type[0:1].upper()))[0]
type_to_display = staticmethod(type_to_display)
自己が渡されないような方法でインスタンスメソッドを使用することはできません。たとえば、クラスのインスタンスmy_car
があり、クラスのインスタンスメソッドCar
を使用する場合、インスタンスは暗黙的にメソッドに渡されます。最初のパラメータとして()。Car
drive
my_car
drive
self
class Car:
def drive(self):
self.do_some_stuff()
my_car = Car()
my_car.drive() # actually calls Car.drive(my_car)
クラスでは、self
変数 (またはクラスcls
メソッドの場合) が必要です。あなたがそれを何と呼びたいかはあなたの決定です。必要に応じて、代わりに呼び出すことができますthis
。
Aは、インスタンスの代わりに最初の引数としてclassmethod
を取得するメソッドです。class
インスタンスを渡さずに呼び出すことができます。つまり、次のclassmethod
ことができます。
SomeObject.some_class_method()
通常の方法では、あなたがする必要があります
SomeObject().some_normal_method()
or
SomeObject.some_normal_method(instance)
self
this
C++と同様に、メソッドが呼び出されたオブジェクトを参照します。しかし、それself
は単なる慣例であることが重要です。好きなように名前を付けて、サブクラスのインスタンスを渡すことができます。