我是python的新手,从文件导入类时遇到此错误 这是我的目录
-*
-- access.py
-- alloweds.py
在我的acces.py
中,我有这个(不是完整的代码)
from alloweds import clasifier, record_user
conn = MySQLdb.connect(host='localhost', user='root', passwd='', db='python')
cursor=conn.cursor()
uuid_id = uuid.uuid1()
alloweds=clasifier()
record = record_user()
和我的alloweds.py
from access import cursor
class clasifier():
def __init__(self):
self.Invited=['Test']
def verify(self,name):
if name in self.Invited:
return('Accept')
else:
return('Deny')
class record_user():
##code
这是错误日志
Traceback (most recent call last):
File ".\access.py", line 9, in <module>
from listaPermitidos import clasifier, record_user
File "C:\Users\rbnvl\alloweds.py", line 3, in <module>
from access import cursor
File "C:\Users\rbnvl\access.py", line 9, in <module>
from alloweds import clasifier, record_user
ImportError: cannot import name 'clasifier' from 'alloweds' (C:\Users\rbnvl\alloweds.py)
答案 0 :(得分:2)
这是循环依赖。再创建一个文件,例如在其中导入光标的database.py。
SQL> select sys_context('userenv', 'db_name') from dual;
SYS_CONTEXT('USERENV','DB_NAME')
---------------------------------------------------------
XE
SQL>
答案 1 :(得分:1)
从两个文件导入时都会出现循环。因此,如果您仅从另一个导入一个文件,就可以了。
答案 2 :(得分:1)
正如已经提到的,您的问题来自循环依赖关系-两个模块彼此依赖-这既是一个一般性的设计问题(无论使用哪种语言,您都不应具有循环依赖关系),并且受到Python的严重支持。 >
尽管有一些快速的技术变通办法只能掩盖症状,但不能解决问题本身。 避免循环依赖的方法多种多样(例如,像ex4的答案中那样,将共同的依赖关系提取到不同的模块中),大多数情况下,您会结合使用thise。在您的情况下,一个非常明显的问题是使您的allowed
模块完全没有理由依赖于全局cursor
。简而言之,您应该在此处将显式的受养人作为参数传递给受养人,即:
class Depender():
def __init__(self, dependee):
self.dependee = dependee
def dothis(self, arg):
return self.dependee.do_something_with(arg)
这种策略(称为“依赖注入”)不仅打破了循环依赖,而且还使您的代码更易于独立测试。
现在,您的代码还有另一个不相关但严重的问题:您的allowed
模块的代码不应该依赖于cursor
对象,而应该依赖于connection
对象本身。第一个也是最主要的原因是游标不是可重入的,因此,如果一个函数使用游标来迭代选择查询问题,并且在迭代期间调用将同一游标用于其他任何操作的另一个函数,则会得到非常意外的结果。另外,您仍然需要连接对象来处理事务。数据库连接成本很高,但是游标是廉价的一次性对象,因此没有充分的理由尝试重用游标。
答案 3 :(得分:-1)
在您的access.py中尝试
from alloweds.classifier import classifier
from alloweds.recode_user import recode_user
如果两个文件都在同一目录中,则此方法有效。但是,如果这些文件位于不同的目录中,将无法使用。如果要从不同级别的目录导入类,则必须通过main.py
导入它们答案 4 :(得分:-2)
您不能导入两个文件,反之亦然,例如,从脚本2中的class1导入Class1和从脚本2中的class2导入Class2。