首页 > 编程 > Python > 正文

python 全局变量的import机制介绍

2020-02-16 10:10:55
字体:
来源:转载
供稿:网友

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

IServer.py

from abc import ABCMeta, abstractmethodprint __name__class IServer:  def __init__(self):    pass  @abstractmethod  def DoWithA(self):    pass  @abstractmethod  def DoWithB(self):    pass

IServer_A.py

import IServerserverType ='1001'print __name__dir()from CreatFactory import GLOBAL_class_dicdir()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_dicprint 'the id of GLOBAL_class_dic in A is:',id(GLOBAL_class_dic)GLOBAL_class_dic[serverType] = IServer_Aprint 'GLOBAL_class_dic in a is:', GLOBAL_class_dic

IServer_B.py

import IServerserverType ='1002'from CreatFactory import GLOBAL_class_dicprint __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_Bprint 'GLOBAL_class_dic in b is:', GLOBAL_class_dic

CreatFactory.py

#coding:UTF-8import os;import sys;import threadingfrom misc import *global GLOBAL_class_dicGLOBAL_class_dic ={1:1}print 'GLOBAL_class_dic in define is:', GLOBAL_class_dicprint 'the id of GLOBAL_class_dic in define is:', id(GLOBAL_class_dic)dir()import IServer_Aimport IServer_Bdef 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']IServerIServer_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_Bthe id of GLOBAL_class_dic in B is: 36230032GLOBAL_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: 36230032GLOBAL_class_dic in a is: {1: 1, '1002': <class IServer_B.IServer_B at 0x022C2ED8>, '1001': <class IServer_A.IServer_A at 0x02273420>}mainGLOBAL_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: 36230176GLOBAL_class_dic in main B is: {1: 1}server : noTraceback (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            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表