Python の組み込みメソッドと混同しています。たとえば、some_string.lower()
とstr.lower(some_string)
とは何で、それらはどのように異なるのでしょうか?
2 に答える
str
Pythonのすべての文字列のクラスの名前です。str.lower
その方法の1つです。
lower
そのインスタンスの1つ(たとえば'ABC'.lower()
)を呼び出す場合は、バインドされたメソッドを呼び出します。これにより、呼び出されたオブジェクトが最初の引数(通常は呼び出されますself
)として自動的に送信されます。
lower
クラス自体を呼び出す場合(つまり、を使用する場合str.lower()
)、バインドされていないメソッドを呼び出します。これは、self引数を自動的に提供しません。したがって、自分で行動するオブジェクトを指定する必要があります。
これらすべてを理解するのが難しいと思われる場合は、クラスでメソッドがどのように定義されているかを検討すると簡単になります。ポイント(空間内のX、Y座標)を表す独自の非常に単純なクラスを作成するとします。そしてshow()
、ポイントを印刷する方法があります。
class Point:
"""This is the constructor of Point"""
def __init__(self, x, y):
# Save arguments as field of our class instance (self)
self.x = x
self.y = y
def show(self):
print self.x, self.y
# We now create an instance of Point:
p = Point(1.0, 2.0)
# We now show p by calling a bound method
p.show()
自己引数を指定する必要がなかったことに注意してください(したがって、p.show()は引数なしで呼び出されました)。実際には、前の呼び出しは多かれ少なかれこれと同等でした:
Point.show(p)
それらは完全に同等ではありませんが、それはより高度なトピックです。それらが同等ではない最も単純なケースの1つは、オブジェクトの作成後にp.showの値を変更した場合です。たとえば、次のようになります。
p.show = 4
p.showp.show()
は関数ではなく整数であるため、コンパイルすらしません。ただし、クラス自体()ではなく、クラスインスタンス( )Point.show(p)
の属性のみを変更したため、変更はありません。show
p
Point
1 つ目はバインドされたメソッド呼び出しで、2 つ目はバインドされていないメソッド呼び出しです。
次のようなメソッドを作成する方法を考えてみてください。
class str:
...
def lower(self):
# And so on
最初の引数は自分自身です。インスタンスからこのメソッドを使用する場合 (たとえばsome_string.lower()
、インスタンスは自動的にメソッドの最初の引数として (as として) 渡されますself
)。
ただし、クラスから(バインドされていないメソッドとして)呼び出す場合、str.lower(some_string)
たとえば、最初の引数として自動的に渡すインスタンスはありません。そのため、代わりにsome_string
は self として渡され、最初のケースでインスタンスで行われたことはすべて で行われsome_string
ます。
ただし、どの文字列にlower()
も呼び出すことができるメソッドがあるため、バインドされていないバージョンを使用する必要はありません。推奨されるスタイルは、 を使用することsome_string.lower()
です。