2016-09-27 6 views
0

Я пытаюсь создать экземпляр класса __Profile в конструкторе класса __Team, но я не могу получить доступ к __Profile. Как я должен это делать?python - модификатор доступа вложенного класса

Это мой код

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 

Мой питон версия 3.5.1

+2

Почему вы вообще используете вложенные классы и '__mangled_names'? * «Мне нужно сохранить класс' __Team', '__Profile' как частный класс» * - почему? – jonrsharpe

+0

Когда вы пытаетесь реализовать модификаторы доступа (или любую другую функцию) на языке, который их не поддерживает, вы достигаете двух вещей: 1) вы не получите удовлетворительных результатов и 2) вы не пользуетесь функциями, которые язык поддерживает. Это похоже на катание на лыжах на велосипеде: хуже, чем на лыжах и хуже, чем на велосипеде. – zvone

ответ

1

У Python нет модификаторов доступа. Если вы попытаетесь обработать __, как традиционный модификатор доступа private, это одна из проблем, которые вы получаете. Ведущие двойные подчеркивания вызывают название mangling - имя __bar внутри a class Foo (или class __Foo, или любое количество ведущих символов подчеркивания до Foo) будет искажено до _Foo__bar.

Если вы действительно хотите, чтобы эти ведущие двойные подчеркивания, вы должны явно искажать имена сами:

self.profile = SlackApi._SlackApi__Team._Team__Profile() 

Это также, как вы бы получить доступ к __Profile класс из-за пределов SlackApi вообще, так вы в основном обходите любые притязания на то, что эти вещи являются частными.

0

Вы можете получить доступ к следующим образом:

SlackApi._SlackApi__Team._Team__Profile 

или вот так:

self._Team__Profile 

Но это просто неправильно. Для вашего удобства не делайте их частным классом.

 Смежные вопросы

  • Нет связанных вопросов^_^