2016-12-07 3 views
0

В качестве примера: math.sqrt() считается функцией, но, "Lower".upper() известен как метод.upper().Почему math.sqrt() называется функцией? Поскольку доступ к точкам обычно используется для методов. Что делает math.sqrt() функцией?

Почему math.sqrt есть функция? Не является ли доступ к точкам показательным для методов?

+0

http://stackoverflow.com/questions/155609/difference-between-a-method-and-a-функция – Idos

+0

'.call_expr()' автоматически не означает, что метод 'call_expr' является методом. '.' - это просто оператор доступа к атрибуту python, а атрибуты объектов - объекты метода. См. [Docs] (https://docs.python.org/2/tutorial/classes.html#instance-objects) ([3] (https://docs.python.org/3/tutorial/classes.html # экземпляра-объекты)). – dhke

+0

Это просто обозначение Python, используемое для пространств имен. Вещь между «.» Или «::» ([как в C++] (http://en.cppreference.com/w/cpp/language/namespace)) это просто дизайнерское решение. Python может обобщать все операции '.something' как _attribute access_, но это просто специфично для спецификации языка Python. Концептуально это всего лишь механизм пространства имен. –

ответ

10

Поскольку math является модуль*, не класса.

sqrt - это функция, определенная внутри модуля math. Вы можете получить доступ к объектам, которые были определены в модуле, с помощью обычного точечного . доступа к объекту модуля. С модулями, хотя при этом доступе не происходит трансформация функционального объекта, объект возвращается как есть.
В частности, since functions are descriptors, их __get__ не вызывается при доступе через модуль.

upper является функцией, которая определена внутри strкласса. Когда вы вызываете его на экземпляр str с использованием точечного доступа, он преобразовал в метод , который неявно получает экземпляр в качестве первого аргумента.
В частности, при доступе через класс вызывается функциональный объект __get__, который, в свою очередь, преобразует функцию в тип метода.


* Хорошо, я ненавижу делать это, потому что это сбивает с толку, но modules are also classes. Они особенны в том, что они не выполняют преобразование, как описано ранее. В частности, их функция getattribute, которая вызывается при запросе атрибута, не действует как по умолчанию для классов.

Смежные вопросы