先把有问题的代码晒一下:
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
新闻热点
疑难解答