0

私はWindows用のアクティブなPython2.7.232ビットのthreadingmodule( )のコードを調べています。<Python Home>/lib/threading.py__init__関数ではclass Thread、多くの変数が定義されています。

self.__target = target
self.__name = str(name or _newname())
self.__args = args
self.__kwargs = kwargs
self.__daemonic = self._set_daemon()
self.__ident = None
self.__started = Event()
self.__stopped = False
self.__block = Condition(Lock())
self.__initialized = True

これが私が次の__init__関数を呼び出す方法ですclass Thread:-

class ThreadWithReturnValue(Thread):
    def __init__(self, group=None, target=None, name=None,
                 args=(), kwargs={}, Verbose=None):

        Thread.__init__(self, group, target, name, args, kwargs, Verbose)
        self._return = None
        print 'in init: ', self._Thread__target

変数がの関数のself._Thread__targetどこにも初期化されていないことを理解できません。しかし、この変数を自分の関数で出力すると、 fromの関数の実際の値が表示されます。__init__class Thread__init__self.__targetclass Thread__init__

また、threadingモジュールを編集して、この行を__init__関数の最後の行として配置しようとしましたclass Thread:-

print 'in init of Thread class in threading: ', self._Thread__target

それでも、値が出力されているのを見ることができ、インタープリターはエラーを表示しません。そこで、名前の変更を行っている可能性のある関数を見つけようとしました。しかし、それを見つけることができませんでした。

__init__これは、の関数で定義された他のすべての変数で発生していますclass Threadself.__targetのような変数がどのようにに名前変更されているのか知りたいですself._Thread__target

4

2 に答える 2

2

これは名前マングリングと呼ばれ、変数がで始まるたびに発生します。__

参照: http: //docs.python.org/release/1.5/tut/node67.html およびhttp://docs.python.org/reference/expressions.html#atom-identifiers

于 2012-10-08T18:03:56.070 に答える
1

Pythonに組み込まれています。ドキュメントから:

クラス定義でテキストで発生する識別子が2つ以上のアンダースコア文字で始まり、2つ以上のアンダースコアで終わらない場合、その識別子はそのクラスのプライベート名と見なされます。プライベート名は、コードが生成される前に、より長い形式に変換されます。トランスフォーメーションは、名前の前にクラス名を挿入し、先頭の下線を削除し、クラス名の前に1つの下線を挿入します。たとえば、__spamという名前のクラスで発生する識別子Hamはに変換され_Ham__spamます。

于 2012-10-08T18:05:34.307 に答える