python自定义类导入问题

文件1:a.py
内容:

class LoginWork:
    def __init__(self):
        pass
    def startLogin(self):
        global login_session
        pass

文件2:b.py
内容:

from a import LoginWork
class SpiderWork:
    def __init__(self):
        pass
    def spiderNow(self):
        login_session.post(...)  <=====问题出现在这里了
        pass        

我的b.py文件要怎样引入a.py中的login_session这个内容的
貌似我怎么导都不能引入的。

阅读 3.9k
2 个回答

login_session 处于 starLogin 的代码块内,LoginWork 被导入到 b 中虽会创建方法属性 startLogin,但并不会执行其内的代码块,因此 global login_session 是不会被执行的。另外,即便实例化 LoginWork 并执行 startLogin 也是无济于事的,因为 startLogin 的执行是在自己的作用域内,执行完毕后便会释放作用域,而 global 语句并不能跨文件!此外,global 语句并非创建一个全局变量,而只是声明其后的变量来自全局变量。
因此,如果 login_session 和 class LoginWork 在同一作用域,可以这么改:

class LoginWork:
    login_session = login_session  #将全局变量变为类属性
    def __init__(self):
        pass
    def startLogin(self):
        pass
from a import LoginWork
class SpiderWork:
    def __init__(self):
        pass
    def spiderNow(self):
        LoginWork.login_session.post(...)  #注意这里的调用
        pass        

或者,直接修改 b 文件,将 import 语句改为:

import a

class SpiderWork:
    def __init__(self):
        pass
    def spiderNow(self):
        login_session.post(...) 
        pass        

login_session是定义在startLogin方法里的,导入的时候不会执行这个方法,所以也不会创建这个变量。只要执行一下startLogin就可以了:

lw = LoginWork()
lw.startLogin() # 现在能用login_session了
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题