Атрибуты класса сбрасываются при импорте из пакета

StackOverflow https://stackoverflow.com/questions/3216908

  •  13-09-2020
  •  | 
  •  

Вопрос

У меня есть проект, который организован примерно так

project/
    __init__.py
    builder.py
    component/
        __init__.py

Внутри builder.py, У меня есть класс под названием Builder, который имеет несколько атрибутов класса для реализации шаблона Borg.Проблема возникает, когда я пытаюсь импортировать Builder в component/__init__.py и внесите изменения в атрибуты класса.Кажется, что любые изменения, которые я вношу в атрибуты класса в пакете, отменяются при возврате функции.

ОБНОВЛЕНИЕ:Вот простой пример того, что происходит.

builder.py

class Builder(object):
    attribute = True

import component

print Builder.attribute

component/___init___.py

from project.builder import Builder

Builder.attribute = False

Выход:

False
True

Судя по тому факту, что напечатаны две строки, я бы предположил, что код в builder.py выполняется дважды, что сбрасывает значение attribute к Истине.

Это было полезно?

Решение

То, что у вас есть, - это циклический импорт:конструктор импортирует компонент, компонент импортирует конструктор.

На момент импорта компонента builder builder еще не полностью создан.Затем компонент импортирует builder, который выполняет остальную часть модуля builder (все после import component).Позже, когда компонент загружен, builder снова продолжает работу со всем, что было после import component.

Обратите внимание, что поведение было бы другим, если бы компонент был загружен первым!

В принципе, вам не следует выполнять циклический импорт.Попробуйте организовать код каким-нибудь другим способом.

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

Вы действительно должны показать (упрощенную версию) своего кода.Что-то вроде (предполагая, напримертот project находится в системном пути):

import builder
builder.Builder.baah = 'boo!'

в component/__init__.py, например, должно работать просто отлично без "отмены" или "сброса".

Но какой именно код являются вы используете вместо этого, чтобы выполнить эти "любые изменения"...?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top