全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

python 全局变量的import机制介绍

先把有问题的代码晒一下:

IServer.py

from abc import ABCMeta, abstractmethod
print __name__

class IServer:
  def __init__(self):
    pass

  @abstractmethod
  def DoWithA(self):
    pass

  @abstractmethod
  def DoWithB(self):
    pass

IServer_A.py

import IServer
serverType ='1001'
print __name__
dir()
from CreatFactory import GLOBAL_class_dic
dir()
class IServer_A(IServer.IServer):
  def __init__(self):
    pass

  def DoWithA(self):
    print 'Server_A do with interface A'

  def DoWithB(self):
    print 'Server_A do with interface B'

global GLOBAL_class_dic

print 'the id of GLOBAL_class_dic in A is:',id(GLOBAL_class_dic)
GLOBAL_class_dic[serverType] = IServer_A
print 'GLOBAL_class_dic in a is:', GLOBAL_class_dic

IServer_B.py

import IServer
serverType ='1002'from CreatFactory import GLOBAL_class_dic
print __name__

class IServer_B(IServer.IServer):
  def __init__(self):
    pass

  def DoWithA(self):
    print 'Server_B do with interface A'

  def DoWithB(self):
    print 'Server_B do with interface B'

print 'the id of GLOBAL_class_dic in B is:',id(GLOBAL_class_dic)
GLOBAL_class_dic[serverType] = IServer_B
print 'GLOBAL_class_dic in b is:', GLOBAL_class_dic

CreatFactory.py

#coding:UTF-8
import os;
import sys;
import threading
from misc import *

global GLOBAL_class_dic

GLOBAL_class_dic ={1:1}
print 'GLOBAL_class_dic in define is:', GLOBAL_class_dic
print 'the id of GLOBAL_class_dic in define is:', id(GLOBAL_class_dic)

dir()

import IServer_A
import IServer_B


def CreateServer(serverType):
  global GLOBAL_class_dic
  print 'GLOBAL_class_dic in use is:', GLOBAL_class_dic
  print 'the id of GLOBAL_class_dic in USE is:', id(GLOBAL_class_dic)
  if GLOBAL_class_dic.has_key(serverType):
    return GLOBAL_class_dic[serverType]
  else:
    return 'no'

if __name__ == '__main__':
  pass
  # 接收到报文后,根据报文的内容,从db中获取到serverType,假设获取到的serverType=1001

  print 'main'
  print 'GLOBAL_class_dic in main A is:', GLOBAL_class_dic
  serverType = '1002'
  server = CreateServer(serverType)
  print 'GLOBAL_class_dic in main B is:', GLOBAL_class_dic
  print 'server :',server
  server.DoWithA(server())

代码内已经加了调试的部分信息, 运行CreatFactory.py。调用DoWithA失败,提示AttributeError: 'str' object has no attribute 'DoWithA'。运行结果如下:

D:\Python27\python.exe "D:/DesignMode/Server --00/CreatFactory.py"
GLOBAL_class_dic in define is: {1: 1}
the id of GLOBAL_class_dic in define is: 36230176
['GLOBAL_class_dic', 'Misc', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'binascii', 'inspect', 'minidom', 'os', 'struct', 'sys', 'threading']
IServer
IServer_A
['IServer', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'serverType']
GLOBAL_class_dic in define is: {1: 1}
the id of GLOBAL_class_dic in define is: 36230032
['GLOBAL_class_dic', 'Misc', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'binascii', 'inspect', 'minidom', 'os', 'struct', 'sys', 'threading']
['IServer', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'serverType']
['GLOBAL_class_dic', 'IServer', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'serverType']
IServer_B
the id of GLOBAL_class_dic in B is: 36230032
GLOBAL_class_dic in b is: {1: 1, '1002': <class IServer_B.IServer_B at 0x022C2ED8>}
['GLOBAL_class_dic', 'IServer', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'serverType']
the id of GLOBAL_class_dic in A is: 36230032
GLOBAL_class_dic in a is: {1: 1, '1002': <class IServer_B.IServer_B at 0x022C2ED8>, '1001': <class IServer_A.IServer_A at 0x02273420>}
main
GLOBAL_class_dic in main A is: {1: 1}
GLOBAL_class_dic in use is: {1: 1}
the id of GLOBAL_class_dic in USE is: 36230176
GLOBAL_class_dic in main B is: {1: 1}
server : no
Traceback (most recent call last):
 File "D:/DesignMode/Server --00/CreatFactory.py", line 38, in <module>
  server.DoWithA(server())
AttributeError: 'str' object has no attribute 'DoWithA'

Process finished with exit code 1

从运行的结果,可以看到:GLOBAL_class_dic 被定义了2次。有两个不同的id,第一次定义分配了一块内存,第二次不明原因的又重新分配了一块内存,然后服务的自动注册全部注册在这块内存中,等到main函数使用的使用,又使用的是第一次申请的内存,所以导致程序运行失败。那问题就来了,为什么会被重新又分配了一次?

之所以会被重新定义一次全局变量,是因为在执行CreatFactory.py时,最开始定义了全局变量,此时该命名空间可使用的函数和变量打印:['GLOBAL_class_dic', 'Misc', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'binascii', 'inspect', 'minidom', 'os', 'struct', 'sys', 'threading',然后在import IServer_A,在IServer_A.py中,import IServer后,在from CreatFactory import GLOBAL_class_dic打印出可使用的函数和变量时,['IServer', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'serverType'],就没有GLOBAL_class_dic,程序发现没有,就又重新声明了一遍。似乎问题原因已经找到了。

python在导入的时候,有2种场景,一种就是在文件前普通的import语句,还有一种就是特殊的场景:__main__模块是相对于Python的导入系统。在最开始运行CreatFactory.py文件时,__name__打印的值是__main__,而再子类再次导入时,会在当前命名空间查找是否已经导入__name__=CreatFactory,发现这个模块不存在,故此又导入了一遍,全局变量由此又被重新定义分配了内存,后期全局变量在子类业务的使用就都使用该值,而在main函数里,使用的又是当前的作用域内的第一次定义的全局变量。


# python  # import机制  # Python入门基础之import机制  # 详解Python中import机制  # Python 中的 import 机制之实现远程导入模块  # Python中import机制详解  # python之import机制详解  # python的import 机制是怎么实现的  # 全局变量  # 配了  # 子类  # 一遍  # 的是  # 来了  # 是因为  # 又是  # 而在  # 会在  # 不存在  # 可以看到  # 先把  # 相对于  # 就又  # 就都  # 后期  # 在这块  # 不明原因  # 找到了 


相关文章: 如何规划企业建站流程的关键步骤?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  清除minerd进程的简单方法  建站之星后台密码遗忘如何找回?  个人摄影网站制作流程,摄影爱好者都去什么网站?  制作证书网站有哪些,全国城建培训中心证书查询官网?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  如何配置WinSCP新建站点的密钥验证步骤?  如何在橙子建站中快速调整背景颜色?  C++如何使用std::optional?(处理可选值)  建站之星与建站宝盒如何选择最佳方案?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  如何在局域网内绑定自建网站域名?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?    如何通过服务器快速搭建网站?完整步骤解析  建站之星官网登录失败?如何快速解决?  如何在IIS服务器上快速部署高效网站?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  移民网站制作流程,怎么看加拿大移民官网?  IOS倒计时设置UIButton标题title的抖动问题  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何在阿里云香港服务器快速搭建网站?  宁波自助建站系统如何快速打造专业企业网站?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  如何快速上传建站程序避免常见错误?  如何选择靠谱的建站公司加盟品牌?  如何在IIS中新建站点并配置端口与IP地址?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  如何通过cPanel快速搭建网站?  如何在VPS电脑上快速搭建网站?  如何选择PHP开源工具快速搭建网站?  如何快速上传自定义模板至建站之星?  如何通过WDCP绑定主域名及创建子域名站点?  C#怎么使用委托和事件 C# delegate与event编程方法  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  详解jQuery停止动画——stop()方法的使用  建站与域名管理如何高效结合?  大连网站设计制作招聘信息,大连投诉网站有哪些?  Python如何创建带属性的XML节点  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何配置FTP站点权限与安全设置?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  公司网站的制作公司,企业网站制作基本流程有哪些?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  如何有效防御Web建站篡改攻击? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。