如何从python中的另一个文件导入类?

时间:2020-04-27 04:57:58

标签: python python-3.x

我是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)

5 个答案:

答案 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。