Переменные экземпляра в 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', '')
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *