Поскольку math
является модуль*, не класса.
sqrt
- это функция, определенная внутри модуля math
. Вы можете получить доступ к объектам, которые были определены в модуле, с помощью обычного точечного .
доступа к объекту модуля. С модулями, хотя при этом доступе не происходит трансформация функционального объекта, объект возвращается как есть.
В частности, since functions are descriptors, их __get__
не вызывается при доступе через модуль.
upper
является функцией, которая определена внутри str
класса. Когда вы вызываете его на экземпляр str
с использованием точечного доступа, он преобразовал в метод , который неявно получает экземпляр в качестве первого аргумента.
В частности, при доступе через класс вызывается функциональный объект __get__
, который, в свою очередь, преобразует функцию в тип метода.
* Хорошо, я ненавижу делать это, потому что это сбивает с толку, но modules are also classes. Они особенны в том, что они не выполняют преобразование, как описано ранее. В частности, их функция getattribute, которая вызывается при запросе атрибута, не действует как по умолчанию для классов.
http://stackoverflow.com/questions/155609/difference-between-a-method-and-a-функция – Idos
'.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
Это просто обозначение Python, используемое для пространств имен. Вещь между «.» Или «::» ([как в C++] (http://en.cppreference.com/w/cpp/language/namespace)) это просто дизайнерское решение. Python может обобщать все операции '.something' как _attribute access_, но это просто специфично для спецификации языка Python. Концептуально это всего лишь механизм пространства имен. –