Введение
В этом практическом занятии (лабораторной работе) вы научитесь проверять, есть ли у объекта определенный метод в Python. В рамках практики рассматриваются методы объектов, с акцентом на то, как они инкапсулируют поведение внутри объектов для создания организованного и повторно используемого кода.
Вы исследуете класс Dog с методами, такими как __init__, bark и get_name, создаете экземпляры этого класса и вызываете эти методы. Затем практика научит вас использовать функции hasattr() и callable() для определения, обладает ли объект определенным методом. В конце вы получите понимание порядка разрешения методов (Method Resolution Order, MRO).
Изучите методы объектов
На этом этапе вы узнаете о методах объектов в Python. Методы - это функции, связанные с объектами. Они используются для выполнения операций над данными объекта. Понимание методов объектов является важным аспектом при работе с объектами и классами в Python.
Начнем с создания простого класса под названием Dog:
class Dog:
def __init__(self, name, breed):
self.name = name
self.breed = breed
def bark(self):
return "Woof!"
def get_name(self):
return self.name
Создайте файл с именем dog.py в каталоге ~/project с помощью редактора VS Code. Скопируйте и вставьте приведенный выше код в файл dog.py.
Этот класс имеет три метода:
__init__: Это конструктор класса. Он вызывается при создании нового объекта этого класса и инициализирует атрибуты объекта.bark: Этот метод возвращает строку "Woof!".get_name: Этот метод возвращает имя собаки.
Теперь создадим объект класса Dog и вызовем его методы. Создайте новый файл с именем main.py в каталоге ~/project:
from dog import Dog
my_dog = Dog("Buddy", "Golden Retriever")
print(my_dog.bark())
print(my_dog.get_name())
Сохраните файл main.py.
Чтобы запустить скрипт main.py, откройте терминал и перейдите в каталог ~/project:
cd ~/project
Затем выполните скрипт с помощью команды python:
python main.py
Вы должны увидеть следующий вывод:
Woof!
Buddy
В этом примере my_dog - это объект класса Dog. Мы вызываем методы bark и get_name для объекта my_dog с использованием точечной нотации (.).
Методы объектов позволяют инкапсулировать поведение внутри объектов, делая ваш код более организованным и повторно используемым. Они являются фундаментальной частью объектно-ориентированного программирования в Python.
Проверка с использованием hasattr() и callable()
На этом этапе вы узнаете, как использовать функции hasattr() и callable() в Python. Эти функции полезны для исследования объектов и определения того, есть ли у них определенные атрибуты или методы.
hasattr(object, attribute_name): Эта функция проверяет, есть ли у объекта заданный атрибут. Она возвращаетTrue, если атрибут существует, иFalseв противном случае.callable(object): Эта функция проверяет, можно ли вызвать объект как функцию (т.е., является ли он вызываемым). Она возвращаетTrue, если объект вызываем, иFalseв противном случае.
Продолжим работу с классом Dog из предыдущего шага. Откройте файл dog.py в каталоге ~/project с помощью редактора VS Code. Содержимое файла должно быть таким:
class Dog:
def __init__(self, name, breed):
self.name = name
self.breed = breed
def bark(self):
return "Woof!"
def get_name(self):
return self.name
Теперь создадим новый файл с именем check_methods.py в каталоге ~/project, чтобы продемонстрировать использование функций hasattr() и callable():
from dog import Dog
my_dog = Dog("Buddy", "Golden Retriever")
print(hasattr(my_dog, "name"))
print(hasattr(my_dog, "bark"))
print(hasattr(my_dog, "age"))
print(callable(my_dog.bark))
print(callable(my_dog.name))
Сохраните файл check_methods.py.
В этом примере:
hasattr(my_dog, "name")проверяет, есть ли у объектаmy_dogатрибут с именем"name". Она вернетTrue, так как классDogимеет атрибутname.hasattr(my_dog, "bark")проверяет, есть ли у объектаmy_dogатрибут с именем"bark". Она вернетTrue, так как классDogимеет методbark.hasattr(my_dog, "age")проверяет, есть ли у объектаmy_dogатрибут с именем"age". Она вернетFalse, так как классDogне имеет атрибутаage.callable(my_dog.bark)проверяет, является ли атрибутmy_dog.barkвызываемым (т.е., является ли это методом). Она вернетTrue, так какbark- это метод.callable(my_dog.name)проверяет, является ли атрибутmy_dog.nameвызываемым. Она вернетFalse, так какname- это строковый атрибут, а не метод.
Чтобы запустить скрипт check_methods.py, откройте терминал и перейдите в каталог ~/project:
cd ~/project
Затем выполните скрипт с помощью команды python:
python check_methods.py
Вы должны увидеть следующий вывод:
True
True
False
True
False
Эти функции полезны для написания более надежного и гибкого кода, который может обрабатывать различные типы объектов и атрибутов.
Понять порядок разрешения методов (MRO)
На этом этапе вы узнаете о порядке разрешения методов (Method Resolution Order, MRO) в Python. MRO - это порядок, в котором Python ищет метод в иерархии классов. Это особенно важно при использовании множественного наследования.
Создадим новую группу классов, чтобы проиллюстрировать MRO. Создайте файл с именем animal.py в каталоге ~/project с помощью редактора VS Code:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "Generic animal sound"
class Mammal(Animal):
def speak(self):
return "Generic mammal sound"
class Dog(Mammal):
def speak(self):
return "Woof!"
class Cat(Mammal):
def speak(self):
return "Meow!"
Сохраните файл animal.py.
Теперь создадим новый файл с именем mro_example.py в каталоге ~/project, чтобы продемонстрировать MRO:
from animal import Animal, Mammal, Dog, Cat
my_dog = Dog("Buddy")
my_cat = Cat("Whiskers")
print(my_dog.speak())
print(my_cat.speak())
Сохраните файл mro_example.py.
В этом примере:
Animal- это базовый класс с методомspeak.Mammalнаследует отAnimalи переопределяет методspeak.Dogнаследует отMammalи переопределяет методspeak.Catнаследует отMammalи переопределяет методspeak.
Когда вы вызываете my_dog.speak(), Python сначала ищет метод speak в классе Dog. Если он не найден там, Python ищет его в классе Mammal, а затем в классе Animal. Этот порядок определяется MRO.
Чтобы запустить скрипт mro_example.py, откройте терминал и перейдите в каталог ~/project:
cd ~/project
Затем выполните скрипт с помощью команды python:
python mro_example.py
Вы должны увидеть следующий вывод:
Woof!
Meow!
Теперь рассмотрим более сложный пример с множественным наследованием. Создайте новый файл с именем mro_complex.py в каталоге ~/project:
class A:
def method(self):
return "A"
class B(A):
def method(self):
return "B"
class C(A):
def method(self):
return "C"
class D(B, C):
pass
d = D()
print(d.method())
print(D.mro())
Сохраните файл mro_complex.py.
В этом примере:
- Класс
Dнаследует от классовBиC. - Классы
BиCнаследуют от классаA. - Метод
methodопределен в классахA,BиC.
Чтобы запустить скрипт mro_complex.py, откройте терминал и перейдите в каталог ~/project:
cd ~/project
Затем выполните скрипт с помощью команды python:
python mro_complex.py
Вы должны увидеть следующий вывод:
B
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
Вывод B показывает, что вызывается метод method из класса B. Метод D.mro() возвращает кортеж, представляющий порядок разрешения методов для класса D. В этом случае MRO имеет вид D -> B -> C -> A -> object. Это означает, что когда вы вызываете d.method(), Python сначала ищет метод в классе D, затем в классе B, затем в классе C, затем в классе A и, наконец, в базовом классе object.
Понимание MRO необходимо для предсказания поведения вашего кода при использовании наследования, особенно множественного наследования.
Резюме
В этом практическом занятии (лабораторной работе) первоначальный этап посвящен пониманию методов объектов в Python. Здесь вводится концепция методов как функций, связанных с объектами, которые являются важными для выполнения операций над данными объекта. Создается класс Dog с методами, такими как __init__, bark и get_name, чтобы продемонстрировать, как методы инкапсулируют поведение внутри объектов.
Затем в рамках практического занятия вас научат создавать экземпляр класса Dog и вызывать его методы с использованием точечной нотации, показывая, как методы объектов способствуют созданию организованного и повторно используемого кода в объектно - ориентированном программировании.



