Частные атрибуты — это атрибуты класса, доступ к которым возможен только внутри самого класса.
Частные атрибуты — это важные атрибуты класса, доступ к которым возможен только внутри самого класса. Если вы раньше работали с такими языками, как 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. Если вы зарегистрируетесь по моей ссылке ниже, я получу небольшую комиссию без каких-либо дополнительных затрат для вас.
Если эта статья была для вас очень ценной, подумайте о том, чтобы угостить меня кофе — каждый маленький вклад будет очень ценен!
Если вы хотите получать уведомления о моих публикациях, присоединитесь к моему списку рассылки.
Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Получите эксклюзивный доступ к возможностям написания и советам в нашем сообществе Discord.