Программа курса:
Атрибуты-функции в классах
.jpg)
Помимо атрибутов, представляющих собой переменные, в классах можно использовать функции в качестве атрибутов. Рассмотрим пример:
class Car:
def drive():
print("Машина едет")
Если мы выведем словарь атрибутов этого класса, то увидим, что среди них есть атрибут drive
, который является объектом-функцией:
print(Car.__dict__)
В словаре атрибутов можно увидеть ключ drive
, значение которого — это функция. Для вызова такой функции-атрибута можно использовать следующее:
Car.drive() # Машина едет
Здесь Car
— это имя класса, а drive
— имя функции, которую мы вызываем через атрибут класса.
Вызов атрибутов-функций через getattr()
Также можно воспользоваться функцией getattr()
, чтобы вызвать функцию-атрибут класса:
getattr(Car, 'drive')() # Машина едет
Обратите внимание на обязательное использование круглых скобок для вызова функции — это называется оператором вызова. Без него мы просто получим ссылку на функцию, но не вызовем её.
Ошибка при вызове функции через экземпляр класса
Если попытаться обратиться к атрибуту-функции класса через экземпляр класса (ЭК), то возникнет ошибка:
a = Car()
a.drive() # TypeError: Car.drive() takes 0 positional arguments but 1 was given
Ошибка возникает, потому что функция в классе ожидает один обязательный аргумент, а мы не передаем его. Это происходит потому, что функция в классе является методом, который требует первый аргумент для ссылки на экземпляр класса. Об этом мы подробнее поговорим на следующем уроке.
Решение с использованием @staticmethod
Чтобы можно было вызывать функцию через ЭК без ошибки, можно использовать декоратор @staticmethod
(его мы разберём в следующих темах). Он позволяет вызывать метод как через сам класс, так и через его экземпляр:
class Car:
@staticmethod
def drive():
print("Машина едет")
# Вызов через класс
Car.drive() # Машина едет
# Вызов через экземпляр класса
a = Car()
a.drive() # Машина едет
В данном примере декоратор @staticmethod
избавляет от необходимости передавать ссылку на экземпляр, и теперь метод drive()
можно вызывать и через класс, и через его экземпляр.
Вот таблица, обобщающая информацию из лекции о функциях как атрибутах классов:
Операция | Синтаксис/Функция | Пример | Вывод |
---|---|---|---|
Определение функции в классе | def function_name(): | class Car: def drive(): print("Машина едет") | — |
Доступ к словарю атрибутов класса | class_name.__dict__ | print(Car.__dict__) | {'drive': <function ...>} |
Вызов функции-атрибута через класс | class_name.function_name() | Car.drive() | Машина едет |
Вызов функции-атрибута через getattr() | getattr(class_name, 'function_name')() | getattr(Car, 'drive')() | Машина едет |
Ошибка при вызове функции через экземпляр класса | instance.function_name() | a = Car(); a.drive() | TypeError: Car.drive() takes 0 positional arguments but 1 was given |
Решение с использованием @staticmethod | @staticmethod перед определением метода | class Car: @staticmethod def drive(): ... | Метод вызывается без аргументов |
Вызов метода через класс и экземпляр | class_name.function_name() / instance.function_name() | Car.drive() / a.drive() | Машина едет |
Эта таблица обобщает ключевые моменты, касающиеся работы с функциями как атрибутами классов, включая определение, доступ, вызов, а также обработку ошибок и применение декоратора @staticmethod
.
Комментарии
Ограниченный доступ
Вы можете только просматривать лекции, так как данный курс является платным. Чтобы получить полный доступ к курсу, приобретите его!