欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python 全局變量的import機制介紹

 更新時間:2017年09月07日 17:01:22   作者:loleina  
在之前學習python設計模式(工廠模式實踐篇),希望使用全局變量代替c++的宏完成服務自動注冊功能時,遇到過一個問題,全局變量的定義和使用放在同一個可執(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
  # 接收到報文后,根據(jù)報文的內容,從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函數(shù)使用的使用,又使用的是第一次申請的內存,所以導致程序運行失敗。那問題就來了,為什么會被重新又分配了一次?

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

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

相關文章

  • Python編程實現(xiàn)從字典中提取子集的方法分析

    Python編程實現(xiàn)從字典中提取子集的方法分析

    這篇文章主要介紹了Python編程實現(xiàn)從字典中提取子集的方法,結合實例形式對比分析了Python采用字典推導式與序列轉換實現(xiàn)字典提取子集的相關操作技巧與優(yōu)缺點,需要的朋友可以參考下
    2018-02-02
  • python下載文件的兩種方式

    python下載文件的兩種方式

    這篇文章主要介紹了python下載文件的兩種方式:接口方式和Nginx這兩種方式,并通過代碼示例講解的非常詳細,對大家學習python下載文件有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • Python如何用wx模塊創(chuàng)建文本編輯器

    Python如何用wx模塊創(chuàng)建文本編輯器

    在本篇文章里小編給大家整理的是關于Python的wx模塊創(chuàng)建文本編輯器方法,需要的朋友們可以參考下。
    2020-06-06
  • python爬蟲破解字體加密案例詳解

    python爬蟲破解字體加密案例詳解

    這篇文章主要介紹了python爬蟲破解字體加密案例詳解,本文通過圖文實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Django用戶認證系統(tǒng) Web請求中的認證解析

    Django用戶認證系統(tǒng) Web請求中的認證解析

    這篇文章主要介紹了Django用戶認證系統(tǒng) Web請求中的認證解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Python如何安裝mysql數(shù)據(jù)庫模塊

    Python如何安裝mysql數(shù)據(jù)庫模塊

    這篇文章主要介紹了Python如何安裝mysql數(shù)據(jù)庫模塊問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 用Python中的wxPython實現(xiàn)最基本的瀏覽器功能

    用Python中的wxPython實現(xiàn)最基本的瀏覽器功能

    這篇文章主要介紹了用Python中的wxPython實現(xiàn)基本的瀏覽器功能,本文來自于IBM官方網(wǎng)站開發(fā)者文檔,需要的朋友可以參考下
    2015-04-04
  • Windows下PyCharm安裝圖文教程

    Windows下PyCharm安裝圖文教程

    這篇文章主要為大家詳細介紹了Windows下PyCharm安裝圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Python中的字典與成員運算符初步探究

    Python中的字典與成員運算符初步探究

    這篇文章主要介紹了Python中的字典與成員運算符初步探究,是Python入門學習中的基礎知識,需要的朋友可以參考下
    2015-10-10
  • python字典DICT類型合并詳解

    python字典DICT類型合并詳解

    這篇文章主要為大家詳細介紹了python字典DICT類型合并,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論