Как вызвать функцию из функции, которая в классе?
У методов по умолчанию задается параметр self , который незаметно перекладывается при вызове метода объектом:
# В test будет передана ссылка на launch, т.е. self это launch launch.test()
Поэтому, для функции test1 нужно вручную передавать параметр, раз его объявили:
def test1(self): print(self.name) test1(self)
Либо, не указывайте в test1 ничего и обращайтесь к self , т.к. область действия происходит внутри метода и self будет доступен:
def test1(): print(self.name) test1()
Как вызвать функцию из другого файла .py
Введение Часто при написании программ на Python возникает ситуация, когда функции или классы, объявленные в одном файле, требуется использовать в другом.
Алексей Кодов
Автор статьи
7 июля 2023 в 18:02
Введение
Часто при написании программ на Python возникает ситуация, когда функции или классы, объявленные в одном файле, требуется использовать в другом. Это может быть необходимым, например, при организации кода по модулям для повышения его читаемости и упрощения сопровождения.
Рассмотрим простой пример. Пусть у нас есть файл functions.py , в котором определена функция:
# functions.py def greet(name): print(f"Hello, !")
И мы хотим вызвать эту функцию в другом файле, например, main.py .
Ошибка при импорте
Наиболее распространенной ошибкой при попытке вызвать функцию из другого файла является ошибка ImportError: No module named ‘file.py’; file is not a package . Она возникает, когда мы пытаемся импортировать функцию следующим образом:
from functions.py import greet
Правильный способ импорта
Ошибка возникает из-за некорректного использования синтаксиса импорта. В Python при импорте модулей расширение .py не указывается. Правильный способ импортировать функцию из другого файла выглядит следующим образом:
from functions import greet
Теперь функцию greet можно вызвать в файле main.py так:
greet("World")
При выполнении этого кода в консоли будет выведено сообщение «Hello, World!».
Вывод
Итак, для вызова функции из другого файла в Python необходимо использовать ключевое слово import без указания расширения файла. Это позволяет организовать код более структурированно, выделяя логически связанные функции и классы в отдельные файлы.
Как вызвать функцию из класса python
В прошлой статье класс Employee полностью перенимал функционал класса Person:
class Person: def __init__(self, name): self.__name = name # имя человека @property def name(self): return self.__name def display_info(self): print(f"Name: ") class Employee(Person): def work(self): print(f" works")
Но что, если мы хотим что-то изменить из этого функционала? Например, добавить работнику через конструктор, новый атрибут, который будет хранить компанию, где он работает или изменить реализацию метода display_info. Python позволяет переопределить функционал базового класса.
Например, изменим классы следующим образом:
class Person: def __init__(self, name): self.__name = name # имя человека @property def name(self): return self.__name def display_info(self): print(f"Name: ") class Employee(Person): def __init__(self, name, company): super().__init__(name) self.company = company def display_info(self): super().display_info() print(f"Company: ") def work(self): print(f" works") tom = Employee("Tom", "Microsoft") tom.display_info() # Name: Tom # Company: Microsoft
Здесь в классе Employee добавляется новый атрибут — self.company , который хранит компания работника. Соответственно метод __init__() принимает три параметра: второй для установки имени и третий для установки компании. Но если в базом классе определен конструктор с помощью метода __init__, и мы хотим в производном классе изменить логику конструктора, то в конструкторе производного класса мы должны вызвать конструктор базового класса. То есть в конструкторе Employee надо вызвать конструктор класса Person.
Для обращения к базовому классу используется выражение super() . Так, в конструкторе Employee выполняется вызов:
super().__init__(name)
Это выражение будет представлять вызов конструктора класса Person, в который передается имя работника. И это логично. Ведь имя работника устанавливается именно в конструкторе класса Person. В самом конструкторе Employee лишь устанавливаем свойство company.
Кроме того, в классе Employee переопределяется метод display_info() — в него добавляется вывод компании работника. Причем мы могли определить этот метод следующим образом:
def display_info(self): print(f"Name: ") print(f"Company: ")
Но тогда строка вывода имени повторяла бы код из класса Person. Если эта часть кода совпадает с методом из класса Person, то нет смысла повторяться, поэтому опять же с помощью выражения super() обращаемся к реализации метода display_info в классе Person:
def display_info(self): super().display_info() # обращение к методу display_info в классе Person print(f"Company: ")
Затем мы можем вызвать вызвать конструктор Employee для создания объекта этого класса и вызвать метод display_info:
tom = Employee("Tom", "Microsoft") tom.display_info()
Консольный вывод программы:
Name: Tom Company: Microsoft
Проверка типа объекта
При работе с объектами бывает необходимо в зависимости от их типа выполнить те или иные операции. И с помощью встроенной функции isinstance() мы можем проверить тип объекта. Эта функция принимает два параметра:
isinstance(object, type)
Первый параметр представляет объект, а второй — тип, на принадлежность к которому выполняется проверка. Если объект представляет указанный тип, то функция возвращает True. Например, возьмем следующую иерархию классов Person-Employee/Student:
class Person: def __init__(self, name): self.__name = name # имя человека @property def name(self): return self.__name def do_nothing(self): print(f" does nothing") # класс работника class Employee(Person): def work(self): print(f" works") # класс студента class Student(Person): def study(self): print(f" studies") def act(person): if isinstance(person, Student): person.study() elif isinstance(person, Employee): person.work() elif isinstance(person, Person): person.do_nothing() tom = Employee("Tom") bob = Student("Bob") sam = Person("Sam") act(tom) # Tom works act(bob) # Bob studies act(sam) # Sam does nothing
Здесь класс Employee определяет метод work(), а класс Student — метод study.
Здесь также определена функция act , которая проверяет с помощью функции isinstance , представляет ли параметр person определнный тип, и зависимости от результатов проверки обращается к определенному методу объекта.
Зайчатки разума

Недавно столкнулся с одной простой задачей, с которой раньше cталкиваться не приходилось, поэтому оставлю себе здесь запись в качестве памятки. В MicroPython необходимо было для одного класса написать встроенный менеджер задач — некий аналог cron и таймера, который бы позволил микроконтроллеру в общем цикле вызывать методы этого же класса (например, проверка состояния GPIO, датчиков, подключения к WiFi, MQTT и т.п.) по расписанию или через заданное количество времени после наступления какого-либо события. В числе прочего планировалась возможность фильтровать задачи по имени для динамической расстановки их приоритетов и я счёл, что лучшим вариантом в этом случае будет хранение в структуре данных имени метода, затем, возможно, создание словаря, ключами которого будут имена методов. Заодно и имя метода в виде строки куда проще передавать в другой метод в качестве параметра плюс аттрибуты отдельным кортежем во втором параметре. Использовать для обратного преобразования (да и для практически любых других задач) eval — мягко говоря, дурной тон, поэтому пришлось мучать гугл. Решение оказалось не простым, а очень простым. Я уже устал удивляться подобному при программировании на python, но всё ещё продолжаю это делать.
Вот тестовый метод класса:
def getParam(self, param):
if param:
return self.config.get(param)
else:
return None
Следующий пример показывает, как можно получить этот метод и использовать снаружи экземпляра класса по его имени:
from esmodule import ESModule esm = ESModule() # 2507 [debug]: Found config file, loading. esm.getParam('essid') # 'vedroid' m = getattr(ESModule, 'getParam') m # m(esm, 'essid') # 'vedroid'
Как видите, всё работает. Естественно, данный способ можно использовать и внутри самого класса, передавая вместо экземпляра класса self. Так же это должно работать в полноценных версиях Python, но я пока не проверял — не было необходимости. Если нужно получить глобальный метод по имени, это можно сделать ещё проще:
m = globals()['methodName']
P.S.: Может быть я просто не умею готовить python и передавать один метод в другой с параметрами, если у вас есть ссылка, куда вы бы хотели ткнуть меня носом — не стесняйтесь, я буду только благодарен. Я всё-таки не программист.
Evgeniy Shumilov — evgeniy.shumilov@gmail.com
Generated with bashblog, a single bash script to easily create blogs like this one
