Частные атрибуты — это атрибуты класса, доступ к которым возможен только внутри самого класса.

Частные атрибуты — это важные атрибуты класса, доступ к которым возможен только внутри самого класса. Если вы раньше работали с такими языками, как Java, возможно, вы знаете, что приватные атрибуты делаются приватными с помощью ключевого слова private. Однако в Python нет ключевого слова private.

Класс Dog с публичным атрибутом — name

class Dog:
    def __init__(self, name):
        self.name = name
rocky = Dog("rocky")
print(rocky.name) # rocky

Здесь, в функции __init__, мы устанавливаем атрибуту name любое имя, которое мы передаем (в данном случае, "rocky"). name здесь является общедоступным атрибутом, что означает, что к нему можно получить доступ и изменить его вне класса.

rocky.name = "lucky"
# this will change rocky's name to lucky
# this is done outside of the Dog class

Класс Dog с приватным атрибутом — name

class Dog:
    def __init__(self, name):
        self.__name = name
rocky = Dog("rocky")

Здесь, в Python, мы можем сделать атрибут закрытым, добавив 2 символа подчеркивания _ перед именем нашей переменной. Здесь вместо использования name мы используем __name в качестве нашей переменной.

print(rocky.__name)
AttributeError: 'Dog' object has no attribute '__name'

Если мы попытаемся получить доступ к частному атрибуту __name извне класса, мы получим ошибку атрибута, указывающую, что наш объект Dog не имеет такого атрибута.

class Dog:
    def __init__(self, name):
        self.__name = name
    def get_name(self):
        return self.__name
rocky = Dog("rocky")
print(rocky.get_name()) # rocky

Чтобы получить доступ к атрибуту __name, нам обычно нужно создать метод получения get_name, чтобы получить доступ к имени.

rocky.__name = "lucky"
print(rocky.get_name()) # rocky

Если мы установим __name какое-либо другое имя вне класса, наш метод get_name все равно сможет вернуть исходное имя "rocky".

Атрибут __dict__ в объектах

Атрибут __dict__ в объектах хранит все его атрибуты. Например, если мы установим здесь self.name как "rocky", это будет отражено в __dict__:.

class Dog:
    def __init__(self, name):
        self.name = name
rocky = Dog("rocky")
print(rocky.__dict__)
# {'name': 'rocky'}

Точно так же, если мы добавим больше атрибутов, в __dict__ появится больше атрибутов.

class Dog:
    def __init__(self, name, age, breed):
        self.name = name
        self.age = age
        self.breed = breed
rocky = Dog("rocky", 5, "german shepherd")
print(rocky.__dict__)
# {'name': 'rocky', 'age': 5, 'breed': 'german shepherd'}

Почему приватные атрибуты вовсе не приватные

Давайте создадим класс с приватным атрибутом

class Dog:
    def __init__(self, name):
        self.__name = name
rocky = Dog("rocky)

Когда мы используем частный атрибут в классе, например. __name, на самом деле отображается как _Dog__name вместо __name. Это известно как изменение имени. Вот что происходит, когда мы печатаем __dict__.

print(rocky.__dict__)
# {'_Dog__name': 'rocky'}

Несмотря на то, что это предполагаемый частный атрибут, мы можем получить к нему доступ и редактировать его вне класса!

rocky._Dog__name = "lucky"
print(rocky._Dog__name) # lucky

Частные атрибуты в Python вовсе не являются частными!

Заключение

Если эта статья была полезной и вы хотите поддержать меня как автора, подумайте о том, чтобы подписаться на членство в Medium — это стоит 5 долларов в месяц, и вы получаете неограниченный доступ к историям на Medium. Если вы зарегистрируетесь по моей ссылке ниже, я получу небольшую комиссию без каких-либо дополнительных затрат для вас.

Зарегистрируйтесь, используя мою ссылку здесь, чтобы читать неограниченное количество статей на Medium!

Если эта статья была для вас очень ценной, подумайте о том, чтобы угостить меня кофе — каждый маленький вклад будет очень ценен!



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



Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Получите эксклюзивный доступ к возможностям написания и советам в нашем сообществе Discord.