2016-09-27 8 views
0

__Profileクラスのコンストラクタで__Profileクラスのインスタンスを作成しようとしていますが、__Profileにアクセスできません。私はどうすればいいのですか?python - ネストされたクラスアクセス修飾子

これは私のPythonのバージョンは3.5.1

+2

なぜネストしたクラスと '__mangled_names'を使っているのですか? * "私は' __Team'、 '__Profile'クラスをプライベートクラスとして保持する必要があります" * - なぜですか? – jonrsharpe

+0

アクセス修飾子(またはその他の機能)をサポートしていない言語で実装しようとすると、次の2つのことが実現します.1)満足のいく結果が得られない、2)言語サポートしています。これはスキー場のようなものです。スキー場よりも悪く、サイクリングよりも悪いです。 – zvone

答えて

1

Pythonにはアクセス修飾子がありません。従来のprivateアクセス修飾語のように__を扱おうとすると、これが問題の1つになります。先頭の2重のアンダースコアは、__barの名前がclass Foo(またはclass __Foo、またはFooより前の任意の数の先頭のアンダースコア)になり、_Foo__barにマングルされます。

あなたが本当にそれらの主要な二重のアンダースコアを維持したい場合は、明示的に名前をマングルする必要があります自分自身:

self.profile = SlackApi._SlackApi__Team._Team__Profile() 

これは、あなたがそう、完全にSlackApiの外側から__Profileクラスにアクセスする方法をもありますあなたは基本的にこれらのものがプライベートであるという偽善をバイパスしています。

0

であるあなたがそうのようにアクセスすることができ

class SlackApi: 
    # my work 
    class __Team: 
     class __Profile: 
      def get(self): 
       # my work 
     def __init__(self, slackApi): 
      self.slackApi = slackApi 
      self.profile = __Profile() 
      self.profile = __Team.__Profile() 
      self.profile = SlackApi.__Team.__Profile() 
      # I tried to all of these case, but I failed 
      # I need to keep '__Team', '__Profile' class as private class 

私のコードです:

SlackApi._SlackApi__Team._Team__Profile 

かそこらのような:

self._Team__Profile 

しかしそれは間違っている。あなた自身の便宜のために、彼らをプライベートクラスにしないでください。