最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python 全局變量的import機(jī)制介紹

 更新時(shí)間:2017年09月07日 17:01:22   作者:loleina  
在之前學(xué)習(xí)python設(shè)計(jì)模式(工廠模式實(shí)踐篇),希望使用全局變量代替c++的宏完成服務(wù)自動(dòng)注冊功能時(shí),遇到過一個(gè)問題,全局變量的定義和使用放在同一個(gè)可執(zhí)行腳本中的問題

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

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
  # 接收到報(bào)文后,根據(jù)報(bào)文的內(nèi)容,從db中獲取到serverType,假設(shè)獲取到的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())

代碼內(nèi)已經(jīng)加了調(diào)試的部分信息, 運(yùn)行CreatFactory.py。調(diào)用DoWithA失敗,提示AttributeError: 'str' object has no attribute 'DoWithA'。運(yùn)行結(jié)果如下:

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

從運(yùn)行的結(jié)果,可以看到:GLOBAL_class_dic 被定義了2次。有兩個(gè)不同的id,第一次定義分配了一塊內(nèi)存,第二次不明原因的又重新分配了一塊內(nèi)存,然后服務(wù)的自動(dòng)注冊全部注冊在這塊內(nèi)存中,等到main函數(shù)使用的使用,又使用的是第一次申請的內(nèi)存,所以導(dǎo)致程序運(yùn)行失敗。那問題就來了,為什么會(huì)被重新又分配了一次?

之所以會(huì)被重新定義一次全局變量,是因?yàn)樵趫?zhí)行CreatFactory.py時(shí),最開始定義了全局變量,此時(shí)該命名空間可使用的函數(shù)和變量打印:['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打印出可使用的函數(shù)和變量時(shí),['IServer', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'serverType'],就沒有GLOBAL_class_dic,程序發(fā)現(xiàn)沒有,就又重新聲明了一遍。似乎問題原因已經(jīng)找到了。

python在導(dǎo)入的時(shí)候,有2種場景,一種就是在文件前普通的import語句,還有一種就是特殊的場景:__main__模塊是相對于Python的導(dǎo)入系統(tǒng)。在最開始運(yùn)行CreatFactory.py文件時(shí),__name__打印的值是__main__,而再子類再次導(dǎo)入時(shí),會(huì)在當(dāng)前命名空間查找是否已經(jīng)導(dǎo)入__name__=CreatFactory,發(fā)現(xiàn)這個(gè)模塊不存在,故此又導(dǎo)入了一遍,全局變量由此又被重新定義分配了內(nèi)存,后期全局變量在子類業(yè)務(wù)的使用就都使用該值,而在main函數(shù)里,使用的又是當(dāng)前的作用域內(nèi)的第一次定義的全局變量。

相關(guān)文章

  • Python基于sftp及rsa密匙實(shí)現(xiàn)遠(yuǎn)程拷貝文件的方法

    Python基于sftp及rsa密匙實(shí)現(xiàn)遠(yuǎn)程拷貝文件的方法

    這篇文章主要介紹了Python基于sftp及rsa密匙實(shí)現(xiàn)遠(yuǎn)程拷貝文件的方法,結(jié)合實(shí)例形式分析了基于RSA秘鑰遠(yuǎn)程登陸及文件操作的相關(guān)技巧,需要的朋友可以參考下
    2016-09-09
  • 使用wxpy實(shí)現(xiàn)自動(dòng)發(fā)送微信消息功能

    使用wxpy實(shí)現(xiàn)自動(dòng)發(fā)送微信消息功能

    這篇文章主要介紹了使用wxpy實(shí)現(xiàn)自動(dòng)發(fā)送微信消息功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • python制作簡單五子棋游戲

    python制作簡單五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了python制作簡單五子棋游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • OpenCV半小時(shí)掌握基本操作之濾波器

    OpenCV半小時(shí)掌握基本操作之濾波器

    這篇文章主要介紹了OpenCV基本操作之濾波器,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Python3 A*尋路算法實(shí)現(xiàn)方式

    Python3 A*尋路算法實(shí)現(xiàn)方式

    今天小編就為大家分享一篇Python3 A*尋路算法實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 利用Python找出序列中出現(xiàn)最多的元素示例代碼

    利用Python找出序列中出現(xiàn)最多的元素示例代碼

    這篇文章主要給大家介紹了關(guān)于利用Python找出序列中出現(xiàn)最多的元素的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • python 讀取txt中每行數(shù)據(jù),并且保存到excel中的實(shí)例

    python 讀取txt中每行數(shù)據(jù),并且保存到excel中的實(shí)例

    下面小編就為大家分享一篇python 讀取txt中每行數(shù)據(jù),并且保存到excel中的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python使用Pandas和Matplotlib按中值對箱形圖進(jìn)行排序

    Python使用Pandas和Matplotlib按中值對箱形圖進(jìn)行排序

    箱形圖是可視化數(shù)據(jù)分布的強(qiáng)大工具,因?yàn)樗鼈兲峁┝藢?shù)據(jù)集內(nèi)的散布、四分位數(shù)和離群值的洞察,在本文中,我們將探索如何在Python中使用Pandas和Matplotlib按中值對箱形圖進(jìn)行排序,需要的朋友可以參考下
    2025-04-04
  • 利用Pycharm斷點(diǎn)調(diào)試Python程序的方法

    利用Pycharm斷點(diǎn)調(diào)試Python程序的方法

    今天小編就為大家分享一篇利用Pycharm斷點(diǎn)調(diào)試Python程序的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python中集合的內(nèi)置函數(shù)詳解

    Python中集合的內(nèi)置函數(shù)詳解

    這篇文章主要介紹了Python中集合的內(nèi)置函數(shù)詳解,集合在python里面是另外一種對象,它的特征是在大括號(hào)里面,并且各個(gè)元素是唯一的,今天我們來看一下其內(nèi)置了哪些函數(shù),需要的朋友可以參考下
    2023-08-08

最新評(píng)論

吴堡县| 苍山县| 都安| 五莲县| 广元市| 邢台县| 普格县| 台南县| 西充县| 双辽市| 繁昌县| 比如县| 江山市| 财经| 耒阳市| 娄烦县| 澎湖县| 梨树县| 兴隆县| 法库县| 扎鲁特旗| 呼图壁县| 迁西县| 独山县| 彭山县| 浑源县| 嘉黎县| 苏尼特右旗| 邯郸市| 苗栗县| 时尚| 区。| 梁河县| 长治市| 金阳县| 舞阳县| 萍乡市| 荆州市| 罗江县| 高要市| 乌拉特前旗|