Импорт класса с его зависимостями

Я пытаюсь import класс, который я создал из другого файла, в мой текущий рабочий файл. В этом примере класс выглядит следующим образом:

КлассФайл

class example_class:
    
    def __init__(self, ticker):
        self.df = yf.download(ticker, start='2020-12-31')
    
    def do_something(self):
        return something

Затем, когда я импортирую его в свой рабочий файл и запускаю код:

Рабочий файл

import ClassFile
import yfinance as yf

instance = example_class('MSFT')

Я получаю следующую ошибку:

name 'yf' is not defined

Я понимаю, что yfinance никуда не импортируется, но, изучив, я не смог понять, как его импортировать.

По сути, я пытаюсь понять, как импортировать класс из другого файла вместе с зависимостями внутри указанного класса.

Можете ли вы придумать другое место, куда можно было бы поместить import yfinance as yf, чтобы оно всегда было рядом, когда оно нужно классу? (Подсказка: куда бы вы его поместили, если бы класс был единственным в вашем проекте?)

Karl Knechtel 05.02.2023 23:59

@KarlKnechtel, я пробовал как импортировать его в класс, так и из класса, однако я все еще встречал неопределенное «yf». Однако это может быть ограничением моего использования ноутбуков Jupyter, я не понимаю, почему это так.

Jack_Greenaway 06.02.2023 00:59

Вы пытались поместить его в начало файла, в котором есть класс? Кроме того, , пожалуйста, покажите полные ошибки , скопировав и вставив, начиная со строки, которая говорит Traceback (most recent call last):. Также, пожалуйста, прочитайте минимально воспроизводимый пример и убедитесь (попробовав сами), что кто-то другой может скопировать и вставить код из вопроса в соответствующие файлы, запустить код, как вы описываете, и сразу увидеть точную проблему.

Karl Knechtel 06.02.2023 01:09
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы либо специально импортируете класс, если хотите использовать его имя без классификатора файлов (ClassFile), либо используете классификатор с именем функции. Вам НЕ нужно импортировать модули зависимостей. то есть

import ClassFile

instance = ClassFile.example_class('MSFT')

или:

from ClassFile import example_class

instance = example_class('MSFT')

Я предполагаю, что yf импортирован или объявлен где-то в ClassFile. Это помещает ваш оператор импорта r yf в ClassFile

Я думаю, что это может быть причиной того, что я смущен. Я пытался импортировать yf в ClassFile как внутри класса, так и вне его. Тем не менее, я все еще встречаюсь с тем, что «yf» не определен

Jack_Greenaway 06.02.2023 00:56

в ClassFile в самом верху поставить оператор import yfinance as yf. Затем запустите свой код и опубликуйте все сообщения об ошибках.

Galo do Leste 06.02.2023 01:12
Ответ принят как подходящий

Вам нужно import символ, где вы его используете; в ClassFile.

import yahoofinance as yf

class example_class:
    
    def __init__(self, ticker):
        self.df = yf.download(ticker, start='2020-12-31')
    
    def do_something(self):
        return something

Когда вы что-то import импортируете в текущую область, то есть в текущий файл кода.

Теоретически, если бы вы оставили import ... yf в WorkingFile.py, вы могли бы сказать

import WorkingFile

...
    self.df = WorkingFile.yf.download(ticker, start='2020-12-31')

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

Наоборот, как вы должны его использовать; пользователю ClassFile не нужно знать или заботиться о том, что реализация использует yfinance внутри. Надлежащий класс должен инкапсулировать свои внутренние компоненты от своих пользователей и предоставлять только ту функциональность, которая им непосредственно нужна.

В некоторых сценариях вам нужно идти на компромисс; например, если ClassFile является действительно тонкой оболочкой для yfinance (скажем, он наследуется от него и добавляет новый метод sell_MSFT, но в остальном работает идентично), то, конечно, пользователь должен быть знаком с yfinance в любом случае, и вы можете обратиться к его документации. для большинства функций. Но все же в этом случае import yfinance нужно использовать там, где он действительно используется; в ClassFile.

Другие вопросы по теме