import sys;
import os;
from DB import *;
import mysql.connector;
########################################################################
class htmlForm():
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
self.db = database(database.east_autoExpire);
def maker(self,f):
blabla
def main(f):
htmlform = htmlForm();
return htmlform.maker(f)
当我运行它时,它工作正常。但是,当我通过其他程序调用它时,它给了我全局名称"数据库"没有定义。但是,它已经提前确定了!
来自DB import *;
答案 0 :(得分:2)
总结评论:python模块只是一个容器,里面有一些东西。
import DB
在当前模块中为DB
模块创建名为DB
的引用。from DB import database
将引用从DB
模块复制到当前模块中。 from DB import *
将DB
模块中找到的所有内容复制到当前模块(*)中。除了您无法控制导入的内容之外,与前一行没有区别,因此您可能认为某些内容是导入但未导入,或者您甚至可以覆盖某些符号。例如,假设DB
模块包含:
sys = 'foo'
然后,您的from DB import *
将使用import sys
'foo'
但请注意,import DB
与其他两个可能性之间存在非常重要的区别:第一行使模块可用。这意味着当您执行DB.database
时,这将在执行该行时在database
模块中查找DB
。
通常,由于模块非常静态,因此无关紧要。但是,在您的情况下,DB
模块在您第一次导入时似乎没有database
引用。它会在以后创建它。因此,from DB import *
不会复制它,from DB import database
会大声失败。
您有两个选择:
database
,然后再import DB
} DB.database
放在from DB import database
方法中)。 TLDR :不要使用__init__
,所有其他问题都会变得明显。
(*)如果定义了import *
,则只会复制这些名称。