Переменные класса и экземпляра в Python

В этой статье мы расскажем про переменные класса и экземпляра в Python. Мы разберем, чем они отличаются и как с ними работать.

Объектно-ориентированное программирование позволяет использовать переменные на уровне класса или на уровне экземпляра класса. Переменные – это, по сути, символы, заменяющие значение, которое вы используете в программе.

На уровне класса переменные называются переменными класса, на уровне экземпляра – переменными экземпляра.

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

Одним из принципов разработки программного обеспечения является принцип DRY (Don’t repeat yourself), который означает «Не повторяйся». Этот принцип направлен на ограничение повторов (дублирования) в коде. Объектно-ориентированное программирование придерживается принципа DRY, поскольку он снижает избыточность.

Для начала

У вас должен быть установлен Python 3 и настроена среда программирования на вашем компьютере или сервере, подходящая для вашей операционной системы (Ubuntu, CentOS, Debian и т.д.)

Переменные класса в Python

Переменные класса определяются в конструкторе класса. Поскольку они принадлежат самому классу, переменные класса разделяются всеми экземплярами класса. Поэтому они, как правило, будут иметь одинаковое значение для каждого экземпляра. Исключение — если вы используете переменную класса для инициализации переменной.

Переменные класса определяются вне всех методов. Обычно они размещаются прямо под заголовком класса, перед методом конструктора и другими методами.

Примечание. Чтобы следовать примерам кода в этом руководстве, откройте интерактивную оболочку Python в своей локальной системе, выполнив команду python3. Затем вы можете копировать, вставлять или редактировать примеры, добавляя код после символов >>>.

Сама по себе переменная класса выглядит следующим образом:

class Shark:
    animal_type = "fish"

Здесь переменной animal_type присвоено значение «fish».

Мы можем создать экземпляр класса Shark (назовем его new_shark) и вывести переменную, используя точечную нотацию:

class Shark:
    animal_type = "fish"

new_shark = Shark()
print(new_shark.animal_type)

Запустим нашу программу:

$ python shark.py

И получим следующий результат:

fish

Программа возвращает значение нашей переменной.

Теперь давайте добавим ещё несколько переменных класса и выведем их:

class Shark:
    animal_type = "fish"
    location = "ocean"
    followers = 5

new_shark = Shark()
print(new_shark.animal_type)
print(new_shark.location)
print(new_shark.followers)

Как и любая другая переменная, переменные класса могут содержать данные любого типа (из доступных в Python). В этой программе есть строки (animal_type и location) и целое число (followers). Давайте снова запустим программу с помощью команды python shark.py и просмотрим на результат:

# Output
fish
ocean
5

Экземпляр new_shark имеет доступ ко всем переменным класса и может выводить их при запуске программы.

Переменные класса позволяют нам определять переменные при построении класса. Затем эти переменные и связанные с ними значения становятся доступными для каждого экземпляра класса.

Переменные экземпляра класса в Python

Переменные экземпляра принадлежат экземплярам класса. Это означает, что для каждого объекта или экземпляра класса переменные экземпляра различны.

В отличие от переменных класса, переменные экземпляра определяются внутри методов.

Например, в приведенном ниже коде переменные класса Shark name и age являются переменными экземпляра:

class Shark:
    def __init__(self, name, age):
        self.name = name
        self.age = age

При создании объекта класса Shark нам нужно определить эти переменные, которые передаются как параметры в методе конструктора или другом методе.

class Shark:
    def __init__(self, name, age):
        self.name = name
        self.age = age

new_shark = Shark("Sammy", 5)

Так же, как и в случае с переменными класса, мы можем вывести переменные экземпляра в консоль:

class Shark:
    def __init__(self, name, age):
        self.name = name
        self.age = age

new_shark = Shark("Sammy", 5)
print(new_shark.name)
print(new_shark.age)

Когда мы запустим указанную выше программу, используя python shark.py, мы получим следующий вывод:

# Output
Sammy
5

Полученный нами вывод состоит из значений переменных, которые мы инициализировали для экземпляра new_shark.

[python_ad_block]

Давайте создадим еще один объект класса Shark под названием stevie:

class Shark:
    def __init__(self, name, age):
        self.name = name
        self.age = age

new_shark = Shark("Sammy", 5)
print(new_shark.name)
print(new_shark.age)

stevie = Shark("Stevie", 8)
print(stevie.name)
print(stevie.age)

# Output:
# Sammy
# 5
# Stevie
# 8

Объект stevie, как и объект new_shark, передает параметры, специфичные для данного конкретного экземпляра класса Shark, чтобы присвоить значения переменным экземпляра.

То есть переменные экземпляра, принадлежащие объектам класса, позволяют каждому объекту или экземпляру иметь разные значения, присвоенные этим переменным.

Работа с переменными класса и экземпляра одновременно

Переменные класса и переменные экземпляра часто используются одновременно. Поэтому давайте рассмотрим такой пример, используя созданный нами класс Shark. Комментарии в программе описывают каждый этап процесса.

class Shark:

    # Переменные класса
    animal_type = "fish"
    location = "ocean"

    # Метод-конструктор с переменными экземпляра name и age
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # Метод с переменной экземпляра followers
    def set_followers(self, followers):
        print("This user has " + str(followers) + " followers")


def main():
    # Первый объект. Установка переменных экземпляра метода-конструктора
    sammy = Shark("Sammy", 5)

    # Вывод переменной экземпляра name
    print(sammy.name)

    # Вывод переменной класса location
    print(sammy.location)

    # Второй объект
    stevie = Shark("Stevie", 8)

    # Вывод переменной экземпляра name
    print(stevie.name)

    # Использование метода set_followers и передача переменной экземпляра followers
    stevie.set_followers(77)

    # Вывод переменной класса animal_type
    print(stevie.animal_type)

if __name__ == "__main__":
    main()

Когда мы запустим программу, используя python shark.py, мы получим следующий результат:

# Output
Sammy
ocean
Stevie
This user has 77 followers
fish

Здесь мы использовали переменные класса и экземпляра в двух объектах класса Shark: sammy и stevie.

Заключение

В объектно-ориентированном программировании переменные на уровне класса называются переменными класса, а на уровне объекта – переменными экземпляра класса.

Это различие позволяет нам использовать переменные класса для инициализации объектов с определенным значением, присвоенным переменным, а переменные экземпляра — чтобы каждый объект мог иметь свои переменные.

Использование переменных, относящихся к классу или экземпляру, помогает придерживаться принципа DRY. То есть способствует уменьшению повторов в коде.


От редакции Pythonist. Рекомендуем также почитать статью «Чем отличаются методы класса, статические и «простые» методы».


Перевод статьи «Understanding Class and Instance Variables in Python 3».