Введение
В этом практическом занятии (лабораторной работе) вы научитесь проверять, есть ли у класса определенный атрибут в Python. Лабораторная работа сосредоточена на понимании атрибутов класса, которые представляют собой переменные, общие для всех экземпляров класса, и их различении от атрибутов экземпляра.
В рамках лабораторной работы вы пройдете по этапам создания класса Dog с атрибутом класса species и атрибутами экземпляра name и age. Вы научитесь обращаться к обоим типам атрибутов и увидите, как изменение атрибута класса влияет на все экземпляры. Затем в лабораторной работе будут представлены и использованы функции hasattr() и getattr() для безопасной проверки наличия и доступа к атрибутам в классе.
Понять атрибуты класса
На этом этапе вы узнаете о атрибутах класса в Python. Атрибуты класса - это переменные, определенные внутри класса и общие для всех экземпляров (объектов) этого класса. Они отличаются от атрибутов экземпляра, которые специфичны для каждого отдельного экземпляра. Понимание атрибутов класса является важным аспектом при проектировании эффективных и организованных классов.
Начнем с создания простого класса с атрибутом класса:
Откройте редактор VS Code.
Создайте новый файл с именем
class_attributes.pyв директории~/project.~/project/class_attributes.pyДобавьте следующий код в файл
class_attributes.py:class Dog: species = "Canis familiaris" def __init__(self, name, age): self.name = name self.age = age ## Creating instances of the Dog class dog1 = Dog("Buddy", 3) dog2 = Dog("Lucy", 5) ## Accessing the class attribute print(dog1.species) print(dog2.species) ## Accessing instance attributes print(dog1.name) print(dog2.name)В этом примере
speciesявляется атрибутом класса, так как он определен внутри классаDog, но вне любого метода.nameиage- это атрибуты экземпляра, так как они определены внутри метода__init__и специфичны для каждого экземпляраDog.Запустите скрипт
class_attributes.pyс помощью следующей команды в терминале:python class_attributes.pyВы должны увидеть следующий вывод:
Canis familiaris Canis familiaris Buddy LucyКак вы можете видеть, и
dog1, иdog2имеют одинаковое значениеspecies, которое равно "Canis familiaris". Однако они имеют разные значенияname, так какname- это атрибут экземпляра.Теперь изменим атрибут класса и посмотрим, как это повлияет на экземпляры:
class Dog: species = "Canis familiaris" def __init__(self, name, age): self.name = name self.age = age ## Creating instances of the Dog class dog1 = Dog("Buddy", 3) dog2 = Dog("Lucy", 5) ## Accessing the class attribute print(dog1.species) print(dog2.species) ## Modifying the class attribute Dog.species = "New Species" ## Accessing the class attribute again print(dog1.species) print(dog2.species)Запустите скрипт
class_attributes.pyеще раз:python class_attributes.pyВы должны увидеть следующий вывод:
Canis familiaris Canis familiaris New Species New SpeciesОбратите внимание, что когда мы изменяем
Dog.species, изменения отражаются и вdog1, и вdog2, так как они используют общий атрибут класса.
Этот пример демонстрирует базовую концепцию атрибутов класса. Они общие для всех экземпляров класса и могут быть изменены путем прямого доступа к классу.
Использовать hasattr() для класса
На этом этапе вы научитесь использовать функцию hasattr() в Python для проверки наличия определенного атрибута у класса или объекта. Эта функция полезна для определения существования атрибута перед попыткой доступа к нему, что позволяет избежать ошибок и сделать ваш код более надежным.
Построим на предыдущем примере и используем функцию hasattr() для проверки наличия атрибутов класса и экземпляра в классе Dog:
Откройте файл
class_attributes.pyв редакторе VS Code (тот же файл, который вы создали на предыдущем этапе).~/project/class_attributes.pyИзмените код, добавив проверки с использованием функции
hasattr()следующим образом:class Dog: species = "Canis familiaris" def __init__(self, name, age): self.name = name self.age = age ## Creating an instance of the Dog class dog1 = Dog("Buddy", 3) ## Checking for the existence of class attributes print(hasattr(Dog, "species")) print(hasattr(Dog, "breed")) ## Checking for the existence of instance attributes print(hasattr(dog1, "name")) print(hasattr(dog1, "age")) print(hasattr(dog1, "breed"))В этом коде мы используем функцию
hasattr()для проверки наличия атрибутовspeciesиbreedу классаDog, а также атрибутовname,ageиbreedу экземпляраdog1.Запустите скрипт
class_attributes.pyс помощью следующей команды в терминале:python class_attributes.pyВы должны увидеть следующий вывод:
True False True True FalseВывод показывает, что класс
Dogимеет атрибутspecies(True), но не имеет атрибутаbreed(False). Аналогично, экземплярdog1имеет атрибутыnameиage(True), но не имеет атрибутаbreed(False).
Функция hasattr() возвращает True, если атрибут существует, и False в противном случае. Это позволяет писать условный код, который обрабатывает разные случаи в зависимости от наличия атрибутов. Например, вы можете предоставить значение по умолчанию, если атрибут отсутствует.
Этот пример демонстрирует, как использовать функцию hasattr() для проверки наличия атрибутов в классе и его экземплярах. Это полезный прием для написания более гибкого и надежного кода.
Безопасный доступ с помощью getattr()
На этом этапе вы узнаете, как использовать функцию getattr() в Python для безопасного доступа к атрибутам класса или объекта. Функция getattr() позволяет указать значение по умолчанию, если атрибут не существует, что предотвращает возникновение исключений AttributeError и делает ваш код более надежным.
Продолжим пример с классом Dog и используем функцию getattr() для доступа к атрибуту breed, который, как мы знаем, может не существовать:
Откройте файл
class_attributes.pyв редакторе VS Code (тот же файл, который вы использовали на предыдущих этапах).~/project/class_attributes.pyИзмените код, добавив вызов
getattr()для безопасного доступа к атрибутуbreed:class Dog: species = "Canis familiaris" def __init__(self, name, age): self.name = name self.age = age ## Creating an instance of the Dog class dog1 = Dog("Buddy", 3) ## Safely accessing the 'breed' attribute using getattr() breed = getattr(dog1, "breed", "Unknown") print(breed) ## Accessing existing attributes print(getattr(dog1, "name"))В этом коде мы используем
getattr(dog1, "breed", "Unknown")для попытки доступа к атрибутуbreedэкземпляраdog1. Если атрибутbreedне существует, функцияgetattr()вернет значение по умолчанию "Unknown". Мы также используемgetattr()для доступа к существующему атрибутуname.Запустите скрипт
class_attributes.pyс помощью следующей команды в терминале:python class_attributes.pyВы должны увидеть следующий вывод:
Unknown BuddyВывод показывает, что так как атрибут
breedне существует, функцияgetattr()вернула значение по умолчанию "Unknown". Атрибутnameбыл успешно получен с помощьюgetattr().
Используя функцию getattr() с указанием значения по умолчанию, вы можете избежать исключений AttributeError и обрабатывать случаи, когда атрибут может отсутствовать. Это делает ваш код более устойчивым и легким в поддержке.
Этот пример демонстрирует, как использовать функцию getattr() для безопасного доступа к атрибутам класса и его экземпляров. Это ценный прием для написания более надежного и гибкого кода.
Резюме
В этом практическом занятии (лабораторной работе) вы узнали о атрибутах класса в Python, которые представляют собой переменные, определенные внутри класса и общие для всех экземпляров. Вы создали класс Dog с атрибутом класса species и атрибутами экземпляра name и age. Вы заметили, что все экземпляры класса Dog имеют одно и то же значение для атрибута species, в то время как каждый экземпляр имеет свои уникальные значения для атрибутов name и age.
Вы также запустили скрипт class_attributes.py и проверили вывод, убедившись, что доступ к атрибутам класса осуществляется так же, как и к атрибутам экземпляра, но они общие для всех экземпляров класса.



