Переменные класса и экземпляра в Python 3
В объектно-ориентированном программировании переменные можно использовать на уровне класса или объекта. Переменная – это символ, который заменяет какое-либо значение в программе.
Если какая-либо переменная будет иметь одно и то же значение во всех объектах программы, её можно определить на уровне класса. Если значение переменной будет изменяться в зависимости от объекта, такую переменную нужно определить на уровне экземпляра (объекта).
DRY (don’t repeat yourself, рус. не повторяйся) – это принцип программирования, который подразумевает снижение повторений кода в рамках программы.
Данное руководство научит пользоваться переменными класса и объектными переменными (или переменными экземпляра) в объектно-ориентированном программировании в Python.
Переменные класса
Переменные класса определяются на уровне класса и применяются ко всем объектам, созданным на его основе. Такая переменная, как правило, имеет одно и то же значение внутри всех объектов на основе этого класса (если только она не используется для инициализации переменной).
Переменная класса, определяемая вне метода, как правило, пишется под заголовком класса и перед методом конструктора и другими методами.
Переменная класса выглядит так:
class Shark: animal_type = "fish"
Создайте тестовую программу shark.py. В этом файле можно создать экземпляр класса 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, переменные класса могут содержать любой тип данных. В данной программе переменные будут содержать строки и целые числа.
Снова запустите программу:
На экране появится:
Объект new_shark имеет доступ ко всем переменным класса и может отобразить их на экране.
Объектные переменные
Объектные переменные имеют индивидуальное значение внутри того или иного объекта.
В отличие от переменных класса, объектные переменные определяются внутри метода.
К примеру, в классе 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("Wally", 5)
Как и переменные класса, объектные переменные можно отобразить:
class Shark: def __init__(self, name, age): self.name = name self.age = age new_shark = Shark("Wally", 5) print(new_shark.name) print(new_shark.age)
python shark.py Wally 5
Полученный результат состоит из значений переменных, которые были инициализированы для объекта new_shark.
Создайте ещё один объект класса Shark (например, stevie):
class Shark: def __init__(self, name, age): self.name = name self.age = age new_shark = Shark("Wally", 5) print(new_shark.name) print(new_shark.age) stevie = Shark("Stevie", 8) print(stevie.name) print(stevie.age)
Объект stevie, как и объект new_shark, передает индивидуальные параметры экземпляра класса 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(): # Первый объект определяет объектные переменные метода конструктора wally = Shark("Wally", 5) # Отображение объектной переменной name print(wally.name) # Отображение переменной класса location print(wally.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()
Вы получите такой результат:
Wally ocean Stevie This user has 77 followers fish
Заключение
В объектно-ориентированном программировании переменные на уровне класса называются переменными класса, а переменные на уровне объекта называются объектными переменными.
Переменные класса можно использовать для инициализации объектов с определенным значением, присвоенным переменным. Объектные переменные имеют индивидуальное значение внутри каждого объекта.
Это позволяет разрабатывать программы по принципу DRY и уменьшить повторение кода.