Почему некоторые методы используют точечную нотацию, а другие нет?

Итак, я только начинаю изучать Python (используя Codecademy), и я немного смущен.

Почему существуют некоторые методы, которые принимают аргумент, а другие используют точечную нотацию?

len() принимает форму, но не будет работать с точечной нотацией:

>>> len("Help")
4
>>>"help".len()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'len'

И аналогично:

>>>"help".upper()
'HELP'
>>>upper("help")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'upper' is not defined

Ответ 1

Ключевым словом здесь является метод. Существует небольшая разница между функцией и методом.

Метод

Является функцией, которая определена в классе данного объекта. Например:

class Dog:
    def bark(self):
        print 'Woof woof!'

rufus = Dog()
rufus.bark() # called from the object

Функция

Функция - это глобально определенная процедура:

def bark():
    print 'Woof woof!'

Что касается вашего вопроса относительно функции len, глобально определенная функция вызывает специальный метод __len__ объекта. Таким образом, в этом сценарии это проблема читаемости.

В противном случае методы лучше, когда применяются только к определенным объектам. Функции лучше, когда они применяются к нескольким объектам. Например, как вы можете загладить число? Вы бы не определяли это как функцию, вы бы определили его как только метод только в классе строк.

Ответ 2

То, что вы называете "точечной нотацией", - это методы класса, и они работают только для классов, которые имеют метод, определенный разработчиком класса. len - встроенная функция, которая принимает один аргумент и возвращает размер этого объекта. Класс может реализовать метод под названием len, если он хочет, но большинство этого не делает. Встроенная функция len имеет правило, которое говорит, что если класс имеет метод под названием __len__, он будет использовать его, поэтому это работает:

>>> class C(object):
...     def __len__(self):
...             return 100
... 
>>> len(C())
100

"help".upper - противоположное. Класс string определяет метод с именем upper, но это не означает, что также должна быть функция, называемая upper. Оказывается, существует функция upper в модуле string, но обычно вам не нужно реализовывать дополнительную функцию только потому, что вы реализовали метод класса.