国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python 全局變量的import機制介紹

2020-01-04 16:41:49
字體:
來源:轉載
供稿:網友

先把有問題的代碼曬一下:

python,import機制

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

從運行的結果,可以看到: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函數里,使用的又是當前的作用域內的第一次定義的全局變量。

 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 青海省| 象州县| 班戈县| 焉耆| 清苑县| 齐河县| 永兴县| 启东市| 玛纳斯县| 报价| 永仁县| 宝鸡市| 双鸭山市| 道真| 定远县| 永兴县| 大余县| 沐川县| 镇坪县| 宜丰县| 姜堰市| 昌邑市| 南城县| 米脂县| 无棣县| 岑巩县| 望奎县| 马山县| 砀山县| 合作市| 宁武县| 祁门县| 南召县| 仁寿县| 淮阳县| 闻喜县| 荃湾区| 神池县| 五常市| 上饶市| 石狮市|