Я пытаюсь 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
никуда не импортируется, но, изучив, я не смог понять, как его импортировать.
По сути, я пытаюсь понять, как импортировать класс из другого файла вместе с зависимостями внутри указанного класса.
@KarlKnechtel, я пробовал как импортировать его в класс, так и из класса, однако я все еще встречал неопределенное «yf». Однако это может быть ограничением моего использования ноутбуков Jupyter, я не понимаю, почему это так.
Вы пытались поместить его в начало файла, в котором есть класс? Кроме того, , пожалуйста, покажите полные ошибки , скопировав и вставив, начиная со строки, которая говорит Traceback (most recent call last):
. Также, пожалуйста, прочитайте минимально воспроизводимый пример и убедитесь (попробовав сами), что кто-то другой может скопировать и вставить код из вопроса в соответствующие файлы, запустить код, как вы описываете, и сразу увидеть точную проблему.
Вы либо специально импортируете класс, если хотите использовать его имя без классификатора файлов (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» не определен
в ClassFile в самом верху поставить оператор import yfinance as yf
. Затем запустите свой код и опубликуйте все сообщения об ошибках.
Вам нужно 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
.
Можете ли вы придумать другое место, куда можно было бы поместить
import yfinance as yf
, чтобы оно всегда было рядом, когда оно нужно классу? (Подсказка: куда бы вы его поместили, если бы класс был единственным в вашем проекте?)