2016-07-27 8 views
1

私は英語の母国語ではないよ、と私はセクション9.6プライベート変数とクラスのローカル参照でhttps://docs.python.org/2/tutorial/classes.html#private-variables-and-class-local-referencesプライベート変数とクラスのローカル参照は

でのpythonを学び、最後の段落は次のように述べている。

exec、eval()またはexecfile()に渡されるコードは、 では、呼び出し元クラスのクラス名が現在のクラスであるとみなされないことに注意してください。 これはグローバルステートメントの効果に似ていますが、同じようにバイトコンパイルされたコードに同様に制限されている の効果があります。 dictを直接参照する場合と同様に、getattr()、setattr()、およびdelattr()にも同じ制限が適用されます( )。

このテキストについてはまったく分かりません。このアイデアを実証するための例を説明してください。

答えて

2

あなたはプライベートメンバを持つクラスを持っている想像:クラス内

class Foo: 
    __attr= 5 

、この属性は__attrとして参照することができます。

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

ではなく、クラスの外:

print(Foo.__attr) # raises AttributeError 

eval、を使用すると違いますクラス内部、またはexecfile:これはあなたが引用された段落で説明されて

class Foo: 
    __attr= 5 

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

execFooを「現在のクラス」とはみなさないため、プライベート属性を参照することはできません(参照する場合を除き、Foo._Foo__attr)。

+0

答えに従えば、exec()またはeval()の名前空間にはプライベート属性は含まれていないと思いますか? "これはグローバルステートメントの効果と似ていますが、その効果は同じようにバイトコンパイルされたコードに制限されます。同じ制限がgetattr()、setattr()、delattr ()、およびdictを直接参照するときに使用します。 – user3044330

+0

@ user3044330 'global'文は、現在のコードブロック(_"一緒にバイトコンパイルされたコード "_)のコードにのみ影響します。私的な属性の名前を変更するのと同じことです。 'exec'や' eval'のコードはクラスコードと一緒にバイトコンパイルされていないので、そこに名前のマングリングは起こりません。 –

+0

これは、exec()またはeval()が "グローバルステートメント"であり、 "クラスブロック"で使用できなかったことを意味していますか?あなたは多くの手助けをしてくれました。私はexec()、eval()を検索し、それらに関する深い知識を得るでしょう。どうもありがとうございます。 – user3044330