Python n'utilise pas d'espaces séparés pour les objets appelables et non appelables: un nom est un nom. s.x
, par les règles Python, doit se référer à exactement le même objet, si vous allez l'appeler ou non. Une autre façon de le mettre: en supposant que _aux
est un nom pas autrement utilisé,
_aux = self.x
_aux()
et
self.x()
doit avoir une sémantique absolument identique en Python, le fait que dans le premier cas, la valeur intermédiaire self.x
est lié à un nom et appelé plus tard nonobstant. Avoir des espaces de nommage uniques, "unifiés" pour les appelables et les non-appelables a un grand nombre d'avantages - il rend les règles de recherche de nom (pour chacun des noms nus et qualifiés) énormément plus simples, par exemple, en les découplant totalement à partir du but auquel le nom en cours de recherche va être mis (soit immédiatement après le résultat de la recherche, ou plus tard encore), et aussi du type (appelable ou non) de n'importe quel objet se présente être d'abord référencé selon les règles de recherche.
Surtout vu le nombre de différents types appelables Python a (fonctions, classes, instances de classes qui définissent __call__
, types spéciaux tels que staticmethod
et classmethod
, ...!-), toute autre règle ne pouvait que conduire au chaos total. (Notez aussi, par exemple, que même C++, un langage qui n'a pas peur de la complexité mais également permet aux instances de classes d'être appelées [[si la classe surcharge operator()
]], utilise une règle d'espace de nom unifiée similaire - encore une fois, faire la distinction entre les appelables et les non-appelables serait un cauchemar totalement injustifié, si les règles étaient différentes à cet égard! -).
Ah, merci. Je ne sais pas pourquoi j'essaie d'être philosophique tard dans la nuit. Ça ne marche jamais très bien. J'étais dans l'état d'esprit de @decorator et j'ai seulement vu le 'return self.x' comme ce qui était finalement appelé. Et, je ne sais même pas ce qui m'a fait penser à essayer ceci, pas pour aggraver les choses :) – orokusaki