2016-11-30 2 views
1

Wenn ich eine Modulebene-Variable mit __ erstellt und versucht, es innerhalb einer Methode einer Klasse (mit global Schlüsselwort) zuzugreifen, trat die Namensänderung auf.Python-Name Mangling auf globale Variable mit __

Lassen Sie mich ein Beispiel zeigen:

__test = 'asd' # module level variable with __ 


class TestClass(object): 
    def test(self): 
     global __test 
     print(__test) # trying to access this variable 


a = TestClass() 
a.test() 

Interpreter angehoben einen Fehler:

NameError: name '_TestClass__test' is not defined

So, wie wir es versucht, Namen-mangle __test in _TestClass__test sehen können.

Ich dachte, dass Name-Mangeln für Klassenvariablen sollten nur verwendet werden (wenn ich sie Zugriff mit self oder Klassenname).

Ist es ein gut definiertes Verhalten, das ich nicht bewusst sind oder es ist eine Art von Python Bug?

Getestet habe ich es auf CPython 3,5

+0

Warum erstellen Sie * "eine Variable auf Modulebene mit' __'" *? – jonrsharpe

+1

Hinweis gesagt wird, wie aus der Dokumentation zitiert * „Diese Mangeln wird ohne Rücksicht auf die syntaktische Position des Bezeichners“ * – jonrsharpe

+0

Eigentlich eine von mir Studenten (I Lehr Python auf einer bestimmten Ebene Anfänger) dies tat, und ich war nicht sicher, warum es habe nicht für ihn gearbeitet. – Pax0r

Antwort

2

Any identifier of the form __spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam , where classname is the current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, as long as it occurs within the definition of a class.

(von the Python documentation, Hervorhebung von mir)

+0

aww Ich habe sollte docs zuerst: P – Pax0r