str
- это имя класса всех строк в Python. str.lower
является одним из его методов.
Если вы вызываете lower
в одном из его экземпляров (например, '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()
Обратите внимание, что нам не нужно было указывать аргумент self (поэтому p.show () был вызван без аргументов). На самом деле предыдущий вызов был более или менее эквивалентен этому:
Point.show(p)
Они не совсем эквивалентны, но это более сложная тема. Один из самых простых случаев, когда они не будут эквивалентны, - это если вы измените значение p.show после создания объекта, например:
p.show = 4
Теперь p.show()
даже не скомпилируется, поскольку p.show больше не функция, а целое число! Однако Point.show(p)
все равно не изменится, поскольку мы изменили атрибут show
только в экземпляре класса (p
), а не в самом классе (Point
).