Переменные экземпляра в Python
В этом руководстве вы узнаете о переменных экземпляра в Python, включая переменные данных и переменные функций.
Что такое переменные экземпляра в Python?
В Python переменные класса привязаны к классу, а переменные экземпляра привязаны к конкретному экземпляру класса. Переменные экземпляра также называются атрибутами экземпляра.
Ниже определяется класс HtmlDocument с двумя переменными класса:
from pprint import pprint class HtmlDocument: version = 5 extension = 'html' pprint(HtmlDocument.__dict__) print(HtmlDocument.extension) print(HtmlDocument.version)
Выход:
mappingproxy({'__dict__': <attribute '__dict__' of 'HtmlDocument' objects>, '__doc__': None, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'HtmlDocument' objects>, 'extension': 'html', 'version': 5})
Класс HtmlDocument имеет две переменные класса: extension и version. Python хранит эти две переменные в атрибуте __dict__. Когда вы получаете доступ к переменным класса через класс, Python ищет их в __dict__ класса.
Следующий код создает новый экземпляр класса HtmlDocument:
home = HtmlDocument()
home является экземпляром класса HtmlDocument. У него есть собственный атрибут __dict__:
pprint(home.__dict__)
Файл home.__dict__ теперь пуст:
{}
В home.__dict__ хранятся переменные экземпляра домашнего объекта, так же как в HtmlDocument.__dict__ хранятся переменные класса HtmlDocument.
В отличие от атрибута __dict__ класса, тип атрибута __dict__ экземпляра является словарем. Например:
print(type(home.__dict__))
Выход:
<class 'dict'>
Поскольку словарь изменчив, вы можете изменить его, например, добавив в словарь новый элемент. Python позволяет вам получить доступ к переменным класса из экземпляра класса. Например:
print(home.extension) print(home.version)
В этом случае Python сначала ищет расширение и версию переменных в файле home.__dict__. Если он не найдет их там, он перейдет к классу и найдет в HtmlDocument.__dict__.
Однако, если Python сможет найти переменные в __dict__ экземпляра, он не будет дальше искать их в __dict__ класса.
Следующее определяет переменную version в объекте home:
home.version = 6
Python добавляет переменную version к атрибуту __dict__ объекта home:
print(home.__dict__)
__dict__ теперь содержит одну переменную экземпляра:
{'version': 6}
Если вы получите доступ к атрибуту version объекта home, Python вернет значение версии в словаре home.__dict__:
print(home.version)
Выход:
6
Если вы измените переменные класса, эти изменения также отразятся на экземплярах класса:
HtmlDocument.media_type = 'text/html' print(home.media_type)
Выход:
text/html
Инициализация переменных экземпляра
На практике вы инициализируете переменные экземпляра для всех экземпляров класса в методе __init__.
Например, следующий код переопределяет класс HtmlDocument, который имеет имя и содержимое двух переменных экземпляра.
class HtmlDocument: version = 5 extension = 'html' def __init__(self, name, contents): self.name = name self.contents = contents
При создании нового экземпляра HtmlDocument вам необходимо передать соответствующие аргументы следующим образом:
blank = HtmlDocument('Blank', '')