Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Ограничение доступа к идентификаторам внутри класса

9 сентября 2013 г. Archy Просмотров: 13801 RSS Обсудить

Ограничение доступа к идентификаторам внутри класса

Все идентификаторы внутри класса в языке Python являются открытыми, т.е. доступы для непосредственного изменения. Для имитации частных идентификаторов можно воспользоваться методами __getattr__(), __getattribute__() и __setattr__(), которые перехватывают обращения к атрибутам класса. Кроме того, можно воспользоваться идентификаторами, названия которых начинаются с двух символов подчеркивания. Такие идентификаторы называются псевдочастными. Псевдочастные идентификаторы доступны внутри класса, но не доступны по имени через экземпляр класса.

Тем не менее, изменить идентификатор через экземпляр класса все равно можно, зная, каким образом искажается название идентификатора. Например, идентификатор __privateVar внутри класса Class1 будет доступен по имени _Class1__privateVar. Как видно из примера, перед идентификатором добавляется название класса с предваряющим символом подчеркивания. Приведем пример использования псевдочастных идентификаторов.

Псевдочастные идентификаторы

class Class1(object):
    def __init__(self, x):
        self.__privateVar = x
    def setVar(self, x):         # Изменение значения
        self.__privateVar = x
    def getVar(self):            # Получение значения
        return self.__privateVar
 
c1 = Class1(10)                  # Создаем экземпляр класса
print c1.getVar()                # Выведет: 10
c1.setVar(20)                    # Изменяем значение 
print c1.getVar()                # Выведет: 20
 
try:                             # Перехватываем ошибки
    print c1.__privateVar        # Ошибка!!!
except AttributeError, msg:
    print msg                    # Выведет: 'Class1' object has
                                 # no attribute '__privateVar'
 
c1._Class1__privateVar = 50      # Значение псевдочастных атрибутов
                                 # все равно можно изменить
 
print c1.getVar()                # Выведет: 50

В классах нового стиля можно ограничить перечень атрибутов, разрешены для экземпляров класса. Для этого разрешенные атрибуты перечисляются внутри класса в атрибуте __slots__(). В качестве значения атрибуту можно присвоить строку или список с названиями идентификаторов. Если производится попытка обращения к атрибуту, не перечисленному в __slots__, то возбуждается исключение AttributeError.

Атрибут __slots__

class Class1(object):
    __slots__ = ["x", "y"]
    def __init__(self, a, b):
        self.x, self.y = a, b
c1 = Class1(1, 2)
print c1.x, c1.y                # Выведет: 1 2
c1.x, c1.y = 10, 20             # Изменяем значения атрибутов
print c1.x, c1.y                # Выведет: 10 20
try:                            # Перехватываем исключения
    c1.z = 50                   # Атрибут z не указан в __slots__
                                # поэтому возбуждается исключение
except AttributeError, msg:
    print msg                   # 'Class1' object has no attribute 'z'

Для любителей путешествовать по разным странам, всегда главным вопросом остается аренда дома или отеля для отдыха. Для туристов Киева есть хороший сайт здесь где собраны наилучшие варианты в одном месте. Вашему вниманию предоставляется лучшие отели города Киев по самым доступным ценам.

Оставьте комментарий!

Используйте нормальные имена.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

(обязательно)