Python "защищенные" атрибуты

Как получить доступ к частному атрибуту родительского класса из подкласса (без его публикации)?

  • Никаких обработчиков для логгера paramiko
  • Использование True, False и None в качестве возвращаемых значений в функциях python
  • Неожиданный аргумент ключевого слова «контекст» при использовании appcfg.py
  • Абстрактные методы в Python
  • прерывать / прерывать time.sleep () в python
  • Загрузить модуль из строки в python
  • Еще один вопрос перезагрузки модуля Python
  • Считываем распечатку python dict (), отсортированную по ключу
  • 6 Solutions collect form web for “Python "защищенные" атрибуты”

    Мое понимание соглашения Python

    • _member защищен
    • __member является частным

    Параметры, если вы контролируете родительский класс

    • Сделайте это защищенным, а не частным, поскольку это похоже на то, что вы действительно хотите
    • Используйте getter (@property def _protected_access_to_member …), чтобы ограничить защищенный доступ

    Если вы не контролируете это

    • Отмените название mangling. Если вы dir (object), вы увидите имена, похожие на _Class__member, что и делает Python, чтобы заставить __ «сделать его приватным». В python нет действительно частного. Это, вероятно, считается злом.

    Некоторые разработчики языка подписываются на следующее предположение:

    «Многие программисты безответственны, тусклые, или и то, и другое».

    Эти разработчики языка будут испытывать соблазн защитить программистов друг от друга, введя private язык на свой язык. Вскоре они признают, что это часто слишком негибко и также protected .

    Разработчики языка, такие как Guido van Rossum от Python, напротив, предполагают, что программисты ответственны за взрослых и способны хорошо разбираться (возможно, не всегда, но обычно). Они обнаруживают, что каждый должен иметь доступ к элементам программы, если есть необходимость сделать это, чтобы язык не мешал делать правильные вещи. (Единственный язык программирования, который может успешно мешать неправильному использованию , – это язык NULL )

    Поэтому _myfield в Python означает что-то вроде «Дизайнер этого модуля делает некоторые неочевидные вещи с этим атрибутом, поэтому, пожалуйста, не изменяйте его и избегайте даже чтения, если сможете – подходящие способы доступа к соответствующей информации были предоставлены ".

    Если вы не можете держаться подальше от доступа к _myfield (например, в особых случаях в подклассе), вы просто получаете к нему доступ.

    Используя @property и @name.setter чтобы сделать то, что вы хотите

    например

     class Stock(object): def __init__(self, stockName): # '_' is just a convention and does nothing self.__stockName = stockName # private now @property # when you do Stock.name, it will call this function def name(self): return self.__stockName @name.setter # when you do Stock.name = x, it will call this function def name(self, name): self.__stockName = name if __name__ == "__main__": myStock = Stock("stock111") myStock.__stockName # It is private. You can't access it. #Now you can myStock.name N = float(raw_input("input to your stock: " + str(myStock.name)+" ? ")) 

    если имя переменной «__secret», а имя класса – «MyClass», вы можете получить к нему доступ так же, как в экземпляре с именем «var»,

    var._MyClass__secret

    Соглашение о том, чтобы предложить / эмулировать защиту, – это назвать его с помощью верхнего подчеркивания: self._protected_variable = 10

    Конечно, любой может изменить его, если он действительно хочет.

    Создайте метод доступа, если я не пропущу что-то:

     def get_private_attrib(self): return self.__privateWhatever 

    Кажется, никто не отвечает на исходный вопрос

    как получить доступ к частному атрибуту родительского класса из подкласса

    Итак, вот простой пример использования, демонстрирующий два варианта: доступ к родительским классам __private переменных и использование декоратора @property :

     class Family: def __init__(self, name): self.__family_name = name @property def name(self): return self.__family_name class Child(Family): def __init__(self, first_name, last_name): super(Child, self).__init__(last_name) self.__child_name = first_name @property def name(self): return (self.__child_name, super(Child, self).name) if __name__ == '__main__': my_child = Child("Albert", "Einstein") # print (my_child.__child_name) # AttributeError - trying to access private attribute '__child_name' # print (my_child.__family_name) # AttributeError - trying to access private attribute '__family_name' print (my_child._Child__child_name) # Prints "Albert" - By accessing __child_name of Child sub-class print (my_child._Family__family_name) # Prints "Einstein" - By accessing __family_name in Family super-class print (" ".join(my_child.name)) # Prints "Albert Einstein" - By using @property decorators in Child and Family 
    Python - лучший язык программирования в мире.