2016-10-09 2 views
1

Так что сегодня я спросил, есть ли что-то вроде Protected класса участников в Python, где многие люди говорят, что нет ничего подобного. или Private. Но я сделал следующий код, чтобы проверить это:На самом деле это не инкапсуляция в Python

class Vehiculo(): 

    def __init__(self, peso): 
     self.__peso = peso 

и от внешнего класса я сделал:

car = Vehiculo(10) 
car.__peso = 20 

и что это напечатано было еще 10, так что это как Private, однако, когда я изменил переменная класса с одним подчеркиванием:

class Vehiculo(): 

     def __init__(self, peso): 
      self._peso = peso 

оно напечатано 20 вместо. Может ли кто-нибудь это объяснить мне? Я читал очень похожую статью (которую многие считают дубликатом), но я НЕ ПОНИМАЮ, что они говорят. Это как раз поведение PublicPrivate. И я хотел бы знать, как сделать поведение Protected, или если это возможно.

Спасибо и регаты.

ответ

2

В классах Python не существует публичных, частных или защищенных. Частным методам и значениям обычно присваивается знак подчеркивания _ в качестве условного обозначения, чтобы напомнить другим разработчикам, что к нему не следует обращаться напрямую. Тем не менее, нет механизмов, препятствующих простому доступу к этим членам.

Двойное подчеркивание (__init__, __lt__ и т. Д.) Обычно используется самим Python для установки определенных переменных уровня модуля или уровня класса. Они иногда упоминаются как "magic methods".

+0

Как я уже говорил, я сделал несколько тестов, и двойное подчеркивание не позволило мне получить доступ к этой переменной из другого модуля или класса, если я не использовал функцию setter ... – Wrong

+0

Вы не показывали, как вы пытались распечатать двойное значение подчеркивания. Скорее всего, вы неправильно обращались к нему. – Soviut

+0

Я уверен, что это правильно ... Может быть, это как-то связано с проверкой python? Я использую 3.5.2 – Wrong

1

Атрибуты с двойным префиксом подчеркивания искажены, но они не являются частными. Вы все еще можете сделать car._Vehiculo__peso = 20, и это успешно установит «частную» переменную.

+0

Я попробовал, и он не изменился – Wrong

+0

Тогда вы сделали что-то другое. – Matthias

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