В Python какая разница между some_string.lower () и str.lower (some_string) - PullRequest
7 голосов
/ 21 мая 2011

Меня смущает встроенный метод в Python.Например, что такое some_string.lower() и str.lower(some_string) и чем они отличаются?

Ответы [ 2 ]

8 голосов
/ 21 мая 2011

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).

3 голосов
/ 21 мая 2011

Первый - это вызов связанного метода, а второй - вызов несвязанного метода.

Подумайте, как бы вы написали такой метод:

class str:
    ...
    def lower(self):
        # And so on

Первый аргументсамостоятельно.Если вы используете этот метод из экземпляра (например, some_string.lower()), экземпляр автоматически передается в качестве первого аргумента метода (как self).

Однако, если вы вызываете его из класса (какнесвязанный метод), например ... 1010 *, нет экземпляра для автоматической передачи в качестве первого аргумента, поэтому вместо этого some_string передается как self, и все, что было бы сделано с экземпляром в первом случаеэто делается с помощью some_string.

На самом деле никогда не требуется использовать несвязанную версию, поскольку любая строка будет иметь метод lower(), который вы можете вызвать. Предпочтительным стилем является использование some_string.lower().

...