[英]Python - Can I import variables from another file as class variables?
[英]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.