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

Вступление

Object-oriented programming позволяет использоватьvariables на уровне класса или на уровне экземпляра. Variables - это, по сути, символы, которые заменяют значение, которое вы используете в программе.

На уровне класса переменные называютсяclass variables, тогда как переменные на уровне экземпляра называютсяinstance variables.

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

Одним из принципов разработки программного обеспечения является принципDRY, который обозначаетdon’t repeat yourself. Этот принцип направлен на ограничение повторения в коде, а объектно-ориентированное программирование придерживается принципа СУХОЙ, поскольку уменьшает избыточность.

Этот урок продемонстрирует использование переменных класса и экземпляра в объектно-ориентированном программировании в Python.

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

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

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

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

class Shark:
    animal_type = "fish"

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

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

shark.py

class Shark:
    animal_type = "fish"

new_shark = Shark()
print(new_shark.animal_type)

Давайте запустим программу:

python shark.py
Outputfish

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

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

shark.py

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)

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

Outputfish
ocean
5

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

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

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

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

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

В приведенном ниже примере классаSharkname и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)

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

shark.py

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, мы получим следующий результат:

OutputSammy
5

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

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

shark.py

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)

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

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

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

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

shark.py

class Shark:

    # Class variables
    animal_type = "fish"
    location = "ocean"

    # Constructor method with instance variables name and age
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # Method with instance variable followers
    def set_followers(self, followers):
        print("This user has " + str(followers) + " followers")


def main():
    # First object, set up instance variables of constructor method
    sammy = Shark("Sammy", 5)

    # Print out instance variable name
    print(sammy.name)

    # Print out class variable location
    print(sammy.location)

    # Second object
    stevie = Shark("Stevie", 8)

    # Print out instance variable name
    print(stevie.name)

    # Use set_followers method and pass followers instance variable
    stevie.set_followers(77)

    # Print out class variable animal_type
    print(stevie.animal_type)

if __name__ == "__main__":
    main()

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

OutputSammy
ocean
Stevie
This user has 77 followers
fish

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

Заключение

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

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

Использование переменных, специфичных для класса и экземпляра, может гарантировать, что наш код придерживается принципа СУХОЙ для уменьшения повторения в коде.