2016-07-27 11 views
1

Ich bin nicht Englisch als Muttersprache, und ich lerne Python bei https://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-referencesprivaten Variablen und Klasse-lokale Referenzen

Im Abschnitt 9.6 private Variablen und Klasse-lokale Referenzen, erklärte der letzte Absatz, dass:

Beachten Sie, dass Code, der an exec, eval() oder execfile() übergeben wird, nicht den Klassennamen der aufrufenden Klasse als aktuelle Klasse betrachtet; Dies ist ähnlich der Wirkung der globalen Anweisung, die Wirkung von , die ebenfalls auf Code beschränkt ist, die zusammen Byte-kompiliert wird. Die gleiche Einschränkung gilt für getattr(), setattr() und delattr(), wie und beim direkten Referenzieren von dict.

Es ist völlig nichts über diesen Text. Bitte erläutern oder geben Sie mir ein Beispiel, um die Idee zu demonstrieren.

Antwort

2

Stellen Sie eine Klasse mit einem eigenen Mitglied haben:

class Foo: 
    __attr= 5 
    print(__attr) # prints 5 

Aber nicht außerhalb der Klasse:

class Foo: 
    __attr= 5 

Innerhalb der Klasse, kann dieses Attribut als __attr referenziert werden

print(Foo.__attr) # raises AttributeError 

Aber es ist anders, wenn Sie eval,verwendenoder execfile innerhalb der Klasse:

class Foo: 
    __attr= 5 

    print(__attr) # prints 5 
    exec 'print(__attr)' # raises NameError 

Dies wird durch den Absatz erklärt Ihnen zitiert. exec berücksichtigt Foo nicht als "aktuelle Klasse", daher kann das private Attribut nicht referenziert werden (es sei denn, Sie verweisen darauf als Foo._Foo__attr).

+0

Folgen Sie Ihrer Antwort, ich nehme an, dass der Namespace von exec() oder eval() private Attribute nicht enthalten? Und ich habe immer noch keine Ahnung von: "Das ist vergleichbar mit der Wirkung der globalen Anweisung, deren Wirkung ebenfalls auf Code beschränkt ist, der zusammen Byte-kompiliert wird. Die gleiche Einschränkung gilt für getattr(), setattr() und delattr(), genauso wie wenn man direkt referiert. " – user3044330

+0

@ user3044330 Die Anweisung 'global' wirkt sich nur auf den Code im aktuellen Codeblock aus (_" Code, der zusammen bytekompiliert wird "_). Das gleiche gilt für die Namensänderung von privaten Attributen. Der Code in der 'exec' oder' eval' wird nicht zusammen mit dem Klassencode byte-kompiliert, so dass dort kein Namens-Mangling auftritt. –

+0

Es ist meine exec() oder eval() sind "globale Anweisung" und konnte nicht in "Klassenblock" verwenden? Sie haben viel geholfen und ich werde nach exec(), eval() suchen, um das Wissen über sie zu vertiefen. Ich danke dir sehr. – user3044330