2017-09-18 11 views
1

予期せぬ問題が発生しています。これは単純化されたコードです:exec()のプライベートクラス関数を呼び出します。python

class test(): 
    def __init__(self,name): 
     self.name = name 

    def __private(self): 
     print(self.name) 

    def public(self): 
     exec("self.__private()") 

obj = test('John') 
obj.public() 

誰もが、私はexec文を取り除くことなく、このコードを動作させることができる方法を知っていますか?

+0

これはプライベートメソッドではありません。 Pythonには "private"というものはありません。 –

+0

@Ignacio Vazquez-Abrams obj .__ private()のように呼び出すと、最も近いものがプライベート関数にアクセスできます。 – Daan

+0

プライベートなものではありません。物事を非公開にすることは意図されていません。複数の継承を使用する場合、属性名の競合を防ぐためです。 –

答えて

1

2つのアンダースコアで始まり、2つのアンダースコアで終わらない属性の名前は、name manglingの対象です。

あなたはクラス定義で

def __private(self): 
    print(self.name) 

を行うと、あなたが実際に_<ClassName>__privateというメソッドを作成します。

あなたはまだ」execまたはeval経由、またはクラス本体の外にそれを呼び出すためにあなたを(該当する場合、このようselfとして、適切な修飾子を使用して)クラス本体内__privateとして、通常はそれにアクセスすることができますが、

def public(self): 
    exec('self._test__private()') 
関連する問題