先把有问题的代码晒一下:
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 机制是怎么实现的
# 全局变量
# 配了
# 子类
# 一遍
# 的是
# 来了
# 是因为
# 又是
# 而在
# 会在
# 不存在
# 可以看到
# 先把
# 相对于
# 就又
# 就都
# 后期
# 在这块
# 不明原因
# 找到了
相关文章:
,交易猫的商品怎么发布到网站上去?
专业商城网站制作公司有哪些,pi商城官网是哪个?
如何自定义建站之星模板颜色并下载新样式?
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
简历在线制作网站免费版,如何创建个人简历?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
高防服务器租用如何选择配置与防御等级?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
高端建站如何打造兼具美学与转化的品牌官网?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
高端云建站费用究竟需要多少预算?
如何选择CMS系统实现快速建站与SEO优化?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
Swift中swift中的switch 语句
建站之星导航配置指南:自助建站与SEO优化全解析
网站app免费制作软件,能免费看各大网站视频的手机app?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
威客平台建站流程解析:高效搭建教程与设计优化方案
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
建站上传速度慢?如何优化加速网站加载效率?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
建站之星安装后如何自定义网站颜色与字体?
江苏网站制作公司有哪些,江苏书法考级官方网站?
北京的网站制作公司有哪些,哪个视频网站最好?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
平台云上自主建站:模板化设计与智能工具打造高效网站
北京网站制作公司哪家好一点,北京租房网站有哪些?
javascript中对象的定义、使用以及对象和原型链操作小结
如何在阿里云通过域名搭建网站?
浅谈Javascript中的Label语句
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
建站之星24小时客服电话如何获取?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
建站之星如何快速生成多端适配网站?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
魔毅自助建站系统:模板定制与SEO优化一键生成指南
建站之星在线版空间:自助建站+智能模板一键生成方案
建站主机数据库如何配置才能提升网站性能?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
如何用腾讯建站主机快速创建免费网站?
如何零基础开发自助建站系统?完整教程解析
如何正确下载安装西数主机建站助手?
孙琪峥织梦建站教程如何优化数据库安全?
广东企业建站网站优化与SEO营销核心策略指南
太平洋网站制作公司,网络用语太平洋是什么意思?
*请认真填写需求信息,我们会在24小时内与您取得联系。