Почему некоторые методы используют точечную нотацию, а другие нет?
Итак, я только начинаю изучать 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
, но обычно вам не нужно реализовывать дополнительную функцию только потому, что вы реализовали метод класса.