Python не использует отдельные пробелы для вызываемых и не вызываемых объектов: имя - это имя - это имя. s.x
, по правилам Python, должен ссылаться на точно того же объекта, независимо от того, собираетесь ли вы вызывать его или нет. Другой способ выразить это: предполагая, что _aux
- это имя, которое не используется иным образом,
_aux = self.x
_aux()
и
self.x()
должен иметь абсолютно идентичную семантику в Python, тот факт, что в первом промежуточное значение self.x
привязывается к имени и вызывается позже, несмотря на это.
Наличие единых, «унифицированных» пространств имен для вызываемых и не вызываемых абонентов имеет огромное количество преимуществ - это делает правила поиска имен (для каждого из голых и квалифицированных имен) чрезвычайно простыми, например, полностью отделяя их от цель , в которую будет помещено искомое имя (будь то сразу после результата поиска или еще позже), а также из типа (вызываемого или не вызываемого) вызываемый) любого объекта, на который оказывается первая ссылка в соответствии с правилами поиска.
Особенно с учетом того, сколько различных вызываемых типов есть в Python (функции, классы, экземпляры классов, которые определяют __call__
, специальные типы, такие как staticmethod
и classmethod
, ...! -), любое другое правило может только привести к полному хаосу. (Также обратите внимание, например, что даже C ++, язык, который определенно не боится сложности, но который также позволяет экземплярам классов вызываться [[если класс перегружает operator()
]], использует аналогичный правило унифицированного пространства имен - опять же, различие между вызываемыми и не вызываемыми объектами было бы совершенно необоснованным кошмаром, если бы правила были иными в этом отношении! -).