Как импортировать класс из другого файла, который импортирует первый класс для [duplicate]

Вот фрагмент кода, который я ввел в мои скрипты, который я не буду запускать в среде py2 / 3-agnostic:

# Thank you, python2-3 team, for making such a fantastic mess with
# input/raw_input :-)
real_raw_input = vars(__builtins__).get('raw_input',input)

Теперь вы можете использовать real_raw_input. Это довольно дорого, но коротко и легко читаемо.

Теоретически вы можете даже назначить raw_input вместо real_raw_input, но могут быть модули, которые проверяют существование raw_input и ведут себя соответственно. Лучше остаться на безопасной стороне.

9
задан ts_pati 21 June 2013 в 01:49
поделиться

5 ответов

Если вы хотите импортировать его только один раз, когда вы можете импортировать его в конструкторе класса и сделать переменную global:

class B():
    def __init__(self):
        global A
        from lib import A
        print "B"

    def hello(self):
        print "hello B"
        a = A()

Это приведет к вводу A в глобальную переменную и сделает ее доступной формой в модуле.

14
ответ дан Michael_Scharf 18 August 2018 в 11:58
поделиться
  • 1
    Можете сделать такой импорт для всего класса, или я делаю это в каждом методе, где мне нужна lib.A? – ts_pati 21 June 2013 в 01:46
  • 2
    вы можете import lib сверху, а затем использовать lib.A() – Michael_Scharf 21 June 2013 в 01:57
  • 3
    если это слишком много, попробуйте import lib as x и используйте x.A() – Michael_Scharf 21 June 2013 в 01:59
  • 4
    Лучше использовать from lib import A ... – tamasgal 21 June 2013 в 08:28
14
ответ дан Michael_Scharf 6 September 2018 в 23:37
поделиться
14
ответ дан Michael_Scharf 30 October 2018 в 04:06
поделиться

Основная проблема заключается в том, что вы пытаетесь импортировать класс, но используете синтаксис, который работает только для импорта модуля. В частности, import lib.A никогда не будет работать, если A - это класс, определенный в модуле lib.a (и импортированный в пространство имен верхнего уровня lib).

Я предлагаю, чтобы вы избегаете использования синтаксиса from _ import _, если вам это действительно не нужно. Это облегчает решение зависимостей:

lib/a.py:

import lib.b # note, we're not importing the class B, just the module b!

class A():
    def foo(self):
        return lib.b.B() # use the class later, with a qualified name

lib/b.py:

import lib.a # again, just import the module, not the class

class B():
    def foo(self):
        return lib.a.A() # use another qualified name reference

lib/__init__.py:

from a import A # these imports are fine, since the sub-modules don't rely on them
from b import B # they can be the public API for the A and B classes

Вы также можете использовать относительный импорт модулей, если вы не хотите, чтобы a и b зависели от имени своего пакета lib.

Это обязательно работать, потому что ни один из классов A или B на самом деле не требует, чтобы другой существовал еще, чтобы быть определенным. Только после того, как они импортируются, экземпляры A должны знать о классе B (и наоборот).

Если один из классов, унаследованный от другого или иным образом используемый экземпляр другого в верхний уровень, вам нужно быть более осторожным, какой модуль был загружен первым, или он может все еще сломаться.

5
ответ дан Blckknght 18 August 2018 в 11:58
поделиться

Когда у вас есть два класса в зависимости друг от друга, обычно это означает, что они действительно принадлежат одному модулю или что у вас слишком жесткая связь, которую нужно разрешить с помощью инъекции зависимостей.

Теперь есть пара угловых случаев, когда импорт изнутри функции является «наименее худшим» решением, но это все равно, что вы должны избегать как можно больше.

5
ответ дан bruno desthuilliers 18 August 2018 в 11:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: