如何正确导入包含静态和动态类的文件?

时间:2015-07-15 16:30:19

标签: python oop import

我有一个主文件(main.py):

execfile("library.py")

#import library : DOESN'T WORK

class c_config(object):

    static_var=3

print(c_config.static_var) # Works both ways

obj=another()

print(obj.dynamic) # Works with execfile and doesn't work with import

和我的库的文件以及我的funcs和类等等(library.py):

class another(object):

    def __init__(self):
        self.dynamic=c_config.static_var+1.3

我想用

导入我的库文件
import library

导致我导入的对象"另一个()"没有看到配置类" c_config"使用static_var,即使我使用config类将其导入此文件...

execfile执行它(不确定原因)。我想构建它以便我使用import。

为什么对象" obj =另一个()"不能访问类" c_config"在文件中它被导入?

2 个答案:

答案 0 :(得分:3)

最可能的问题是你在说

from test_bib.py import *

何时应该使用:

from test_bib import *

导入不需要.py扩展名 - 实际上它会引发ImportError

这也适用于library.py。由于您可以使用execfile运行它,因此library.py文件似乎与您的main.py位于同一目录中。在这种情况下,您还应该能够执行以下操作:

import library

在这种情况下,您的another课程可以通过以下方式访问:

obj = library.another()

编辑:

因此,查看您的最新修改时,c_config似乎会在library.py中使用,而在main.py中定义。

由于您需要将import library导入main,因此c_config中的library.py无效。但导入main会创建循环导入。通常最好将相互依赖的类保存在同一个文件中。

不确定为什么execfile正在运行,除非它无声地失败。但我现在不在我的电脑上,所以我会研究一下。

答案 1 :(得分:0)

真正的问题是你有一个循环导入;要解决这个问题 - 只需使用静态变量作为参数调用another()对象:

import library

class SomeObject(object):
    static_var = 3

obj = library.Another(SomeObject.static_var)

library.py

class Another(object):
    def __init__(self, static_var):
        self.dynamic_var = static_var + 1.3
  

我已经定义了一个类,并希望我导入的函数可以访问它

功能与方法不同。

一个类创建自己的命名空间(它有自己的范围),你不能从函数中访问外部范围。

请记住导入模块时,会执行模块内容。它已经在试图引用一个不存在的对象;这就是为什么它不起作用。