繁体   English   中英

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

[英]How can i import class from another file in python?

我是 python 的新手,从文件中导入 class 时出现此错误,这是我的目录

-*
-- 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)

这就是循环依赖。 再创建一个文件,例如 database.py,在其中导入 cursor。

# database.py
conn = MySQLdb.connect(host='localhost', user='root', passwd='', db='python')
cursor=conn.cursor()

# alloweds.py
from database import cursor
...

# access.py
from alloweds import clasifier, record_user
from database import cursor
...

当您从两个文件导入时,您有一个循环。 因此,如果您只有一个从另一个文件导入,您应该没问题。

如前所述,您的问题来自循环依赖 - 两个模块相互依赖 - 这既是一般设计问题(无论使用什么语言,您都不应该有循环依赖)并且 Python 严重支持。

虽然有一些快速'n'dirty 的技术解决方法,它们只能掩盖症状,但它们并不能解决问题本身。 有多种策略可以避免循环依赖(例如在 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 object 本身。 The first and main reason is that cursors are not reentrant so if one function uses the cursor to iterate over a select query issue, and during the iteration calls another function that uses the same cursor for any other operation, you'll get very unexpected results . 此外,您仍然需要连接 object 来处理事务。 数据库连接成本很高,但游标是廉价的一次性对象,因此没有充分的理由尝试重用 cursor。

在你的access.py中试试,

from alloweds.classifier import classifier
from alloweds.recode_user import recode_user

如果两个文件都在同一目录中,则此方法有效。 但如果它们在不同的目录中,它将不起作用。 如果要从不同级别的目录导入类,则必须通过 main.py 导入它们

反之亦然,您不能导入两个文件,例如脚本 2 中的 from class1 import Class1 和脚本 1 中的 from class2 import Class2。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM