0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

python模塊命名空間及使用事項

jf_78858299 ? 來源:梯閱線條小梯子 ? 作者:小梯子 ? 2023-02-21 14:42 ? 次閱讀

1 python模塊使用事項

1.1 python模塊導(dǎo)入只執(zhí)行一次

描述

python模塊在首次導(dǎo)入時從上到下執(zhí)行模塊內(nèi)容,再次導(dǎo)入直接從內(nèi)存取數(shù)據(jù),不會再從上到下執(zhí)行。

示例

# runonce.py
s='梯閱線條'
print('執(zhí)行一次:{}'.format(s))
# idle執(zhí)行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
# 首次導(dǎo)入模塊,從上到下執(zhí)行模塊內(nèi)容
>>> import runonce as ro
執(zhí)行一次:梯閱線條
>>> ro.s
'梯閱線條'
>>> ro.s='tyxt'
# 再次導(dǎo)入模塊,不執(zhí)行模塊內(nèi)容,直接從內(nèi)存讀取
>>> import runonce as ro
>>> ro.s
'tyxt'

1.2 import和from是賦值語句

描述

python導(dǎo)入模塊的import和from都是隱性賦值語句。類似def。

NO 描述
1 import將模塊對象賦值給模塊名
2 from將模塊屬性值賦給當(dāng)前模塊的同名變量。

修改導(dǎo)入模塊內(nèi)的對象

NO 操作 描述
1 修改可變對象 imort或from導(dǎo)入模塊,通過“模塊.屬性=值”或“變量=值”修改可變對象。
2 修改不可變對象 import導(dǎo)入模塊,通過“模塊.屬性=值”修改不可變對象。

示例

# assing.py
s='梯閱線條'
L=[s,9555]
# idle執(zhí)行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
>>> from assign import s,L
>>> s,L
('梯閱線條', ['梯閱線條', 9555])
>>> s='tyxt';L[1]=2023
>>> import assign
# 導(dǎo)入可變對象被修改時,模塊內(nèi)對象跟著被修改
>>> assign.s,assign.L
('梯閱線條', ['梯閱線條', 2023])
>>> s,L
('tyxt', ['梯閱線條', 2023])
# 使用import 模塊,再通過“模塊.屬性=值”修改模塊內(nèi)不可變對象
>>> assign.s=s
>>> assign.s,assign.L
('tyxt', ['梯閱線條', 2023])

1.3 使用import場景

描述

如果導(dǎo)入的多個模塊中,存在同名屬性,則需使用import進行導(dǎo)入。

示例

# mod_5.py
def myprint(val):
   print('在mod_5:{}'.format(val))
   
# mod_6.py
# mod_6.py
def myprint(val):
   print('在mod_6:{}'.format(val))
   
# idle執(zhí)行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
>>> s='tyxt'
# from語句,多個模塊中,導(dǎo)入同名屬性,只會執(zhí)行最后導(dǎo)入的屬性
>>> from mod_5 import myprint
>>> from mod_6 import myprint
>>> myprint(s)
在mod_6:tyxt
# import導(dǎo)入多個模塊中的同名屬性,通過“模塊.屬性”訪問各自同名屬性
>>> import mod_5,mod_6
>>> mod_5.myprint(s)
在mod_5:tyxt
>>> mod_6.myprint(s)
在mod_6:tyxt

2 python模塊命名空間

python模塊為.py文件,導(dǎo)入模塊會創(chuàng)建模塊對象,模塊文件的頂層變量為模塊屬性。

python的命名空間(namespace)是指從名稱到對象的映射。

對象=f(名稱),f為命名空間。

任何一個名稱,通過命名空間f,都能找到唯一一個對象與之對應(yīng)。

python變量名的創(chuàng)建、修改和查找都是在命名空間進行的。

python模塊命名空間就是模塊對象存放全部模塊內(nèi)變量名的場所。

任何一個模塊屬性名稱都可以通過模塊命名空間找到唯一一個對象與之對應(yīng)。

通過“模塊.屬性名”或“屬性名”的方式進行訪問。

2.1 python模塊生成命名空間

描述

python模塊文件頂層變量名包括:函數(shù)名、類名、函數(shù)外部變量名、類外部變量名,都為模塊屬性。通過“模塊.變量名”方式訪問。

python模塊生成命名空間:

NO 內(nèi)容 描述
1 首次導(dǎo)入執(zhí)行模塊語句 首次導(dǎo)入模塊創(chuàng)建空模塊對象,從上到下執(zhí)行模塊內(nèi)語句。
2 頂層賦值語句為模塊屬性 頂層變量賦值語句的變量名成為模塊屬性,比如:=(def和class外的等于號)、def、class、import、from、as等
3 dict獲取模塊命名空間 模塊命名空間為字典,通過dict獲取屬性及值。

示例

# modnames.py
print('執(zhí)行模塊語句開始')
import sys
s='梯閱線條'
def modf():
   x='modf'
class modc(object):
   y='modc'
print('執(zhí)行模塊語句結(jié)束')
# idle執(zhí)行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
# 從上到下執(zhí)行模塊語句
>>> import modnames
執(zhí)行模塊語句開始
執(zhí)行模塊語句結(jié)束
# 頂層變量賦值成為屬性:import賦值語句
>>> modnames.sys
'sys' (built-in)>
# 頂層變量賦值成為屬性:def、class 外等于號 =
>>> modnames.s
'梯閱線條'
# 頂層變量賦值成為屬性:def 隱性賦值
>>> modnames.modf
<function modf at 0x0400DF18>
# 頂層變量賦值成為屬性:class 隱性賦值
>>> modnames.modc
<class 'modnames.modc'>
# 非頂層變量賦值不能成為屬性:def、class 內(nèi)賦值
>>> modnames.x
Traceback (most recent call last):
 File "", line 1, in 
   modnames.x
AttributeError: module 'modnames' has no attribute 'x'
>>> modnames.y
Traceback (most recent call last):
 File "", line 1, in 
   modnames.y
AttributeError: module 'modnames' has no attribute 'y'
# 通過 __dict__ 字典存儲命名空間的屬性
>>> list(modnames.__dict__.keys())
['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__file__', '__cached__', '__builtins__', 'sys', 's', 'modf', 'modc']
>>> modnames.__dict__['s']
'梯閱線條'
# __file__ : 獲取模塊文件路徑
>>> modnames.__dict__['__file__']
'E:\\\\documents\\\\F盤\\\\modnames.py'

2.2 python點號屬性名運算

python點號屬性名為表達式運算,返回和屬性名匹配的值。

NO 內(nèi)容 描述
1 無點號,X 簡單變量,按LEGB規(guī)則在當(dāng)前作用域內(nèi)搜索變量名X
2 單點號,X.Y 當(dāng)前作用域搜索X,搜索對象X的Y屬性
3 多點號,X.Y.Z 搜索對象X的Y屬性,搜索X.Y對象的Z屬性

點號運算適用于有屬性的任何對象,比如:方法、模塊、類等對象。

2.3 python導(dǎo)入作用域

描述

python作用域由程序位置決定,不受模塊導(dǎo)入和函數(shù)調(diào)用影響。

NO 內(nèi)容 描述
1 被導(dǎo)入文件無法訪問進行導(dǎo)入的文件內(nèi)的變量名 mod2.py導(dǎo)入mod1.py,那么mod1.py是無法訪問mod2.py內(nèi)的變量的。
2 函數(shù)無法訪問其他函數(shù)內(nèi)的變量名,除法物理上的嵌套函數(shù) 函數(shù)fa()是無法方法函數(shù)fb()內(nèi)的變量的,除非fa()是fb()的內(nèi)部函數(shù)。
3 模塊無法訪問其他模塊內(nèi)的變量名,除非導(dǎo)入模塊 模塊mod1.py是無法訪問模塊mod2.py內(nèi)的變量的,除非模塊mod1.py導(dǎo)入模塊mod2.py

示例

# mod_a.py
s='梯閱線條'
def modaf():
   global s
   s = 'tyxt'
# mod_b.py
s='軟件測試開發(fā)'
import mod_a
mod_a.modaf()
print(s,mod_a.s)
# idle執(zhí)行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
# 被導(dǎo)入的模塊 mod_a,不可訪問模塊 mod_b 的變量s
>>> import mod_b
軟件測試開發(fā) tyxt

2.4 python模塊嵌套

描述

python模塊a導(dǎo)入模塊b,模塊b導(dǎo)入模塊c,那么模塊a可以訪問模塊c的屬性。

示例

# modc.py
s='modc'
# modb.py
s='modb'
import modc
print('modb執(zhí)行 s:{}'.format(s))
print('modb執(zhí)行 modc.s:{}'.format(modc.s))
# moda.py
s='moda'
import modb
print('moda執(zhí)行 s:{}'.format(s))
print('moda執(zhí)行 modb.s:{}'.format(modb.s))
print('moda執(zhí)行 modb.modc.s:{}'.format(modb.modc.s))
# idle執(zhí)行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
>>> import moda
# moda 導(dǎo)入 modb,從上到下執(zhí)行modb
modb執(zhí)行 s:modb
modb執(zhí)行 modc.s:modc
# 導(dǎo)入 moda, 從上到下執(zhí)行 moda
moda執(zhí)行 s:moda
moda執(zhí)行 modb.s:modb
# 訪問通過modb導(dǎo)入的modc:modb.modc.s
moda執(zhí)行 modb.modc.s:modc

3 python模塊重載

python模塊導(dǎo)入后,再次導(dǎo)入不會重新加載和執(zhí)行模塊文件代碼。

python的reload函數(shù),強制已加載的代碼重新加載和執(zhí)行,讓模塊動態(tài)更新。

3.1 python模塊重載reload

用法

import moda
from importlib import reload
reload(moda)

描述

python的reload()函數(shù)需先從importlib導(dǎo)入。

reload**( moda )****:**moda為模塊對象,即需先導(dǎo)入moda才能進行reload。

NO 描述
1 reload在當(dāng)前命名空間執(zhí)行新代碼,不會刪除重建命名空間。
2 執(zhí)行有變化的頂層賦值語句。
3 reload會更新import導(dǎo)入的客戶端的引用。
4 reload不更新from導(dǎo)入的客戶端的引用,因為from是復(fù)制屬性,最新的值只有在from客戶端重啟后生效。

示例

# reloadmod.py
s='梯閱線條'
def reloadf():
   print(s)
# idle執(zhí)行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
>>> from importlib import reload
# 未導(dǎo)入模塊不可進行 reload 操作
>>> reload(reloadmod)
Traceback (most recent call last):
 File "", line 1, in 
   reload(reloadmod)
NameError: name 'reloadmod' is not defined
>>> import reloadmod
>>> reloadmod.reloadf()
梯閱線條
# 修改reloadmod.py的 s=’tyxt’
# reloadmod.py
s='tyxt'
def reloadf():
   print(s)
# idle執(zhí)行下面語句
# import取內(nèi)存的舊數(shù)據(jù)
>>> import reloadmod
>>> reloadmod.reloadf()
梯閱線條
# reload 執(zhí)行更新的模塊文件
>>> reload(reloadmod)
'reloadmod' from 'E:\\\\documents\\\\F盤\\\\reloadmod.py'>
>>> reloadmod.reloadf()
tyxt
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7108

    瀏覽量

    89299
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4802

    瀏覽量

    84885
收藏 人收藏

    評論

    相關(guān)推薦

    python模塊安裝方法

    空間中,以上功能可寫成:#!/usr/bin/python# -*- coding: UTF-8 -*-from hello import World如果要將模塊中的所有內(nèi)容全部導(dǎo)入當(dāng)前命名
    發(fā)表于 04-04 14:57

    Python名稱空間分類

    名字的地方,三種名稱空間,(之前遺留的問題x=1,1存放于內(nèi)存中,那名字x存放在哪里呢?名稱空間正是存放名字x與1綁定關(guān)系的地方)一、名稱空間分類1. 全局命名
    發(fā)表于 05-17 16:51

    Linux的命名空間機制

    Linux命名空間概述
    發(fā)表于 03-18 14:40

    命名空間的實現(xiàn)

    (1) 在用fork或clone系統(tǒng)調(diào)用創(chuàng)建新進程時,有特定的選項可以控制是與父進程共享命名空間,還是建立新的命名空間。(2) unshare系統(tǒng)調(diào)用將進程的某些部分從父進程分離,其中
    發(fā)表于 05-24 06:21

    hbase shell創(chuàng)建命名空間

    一.hbase shell創(chuàng)建命名空間hbase shellcreate_namespace "gofish"二.python實現(xiàn)hbase增刪改查# -*- coding
    發(fā)表于 07-28 06:45

    什么是python包、模塊和庫?

    1. 模塊以 .py 為后綴的文件,我們稱之為 模塊,英文名 Module。模塊讓你能夠有邏輯地組織你的 Python 代碼段,把相關(guān)的代碼分配到一個
    發(fā)表于 03-09 16:48

    python常規(guī)包與命名空間

    python常規(guī)包與命名空間包1. 常規(guī)包在 Python 3.3 之前或者說 Python 2 中,一個包想要被導(dǎo)入使用,那么該包內(nèi)必須要
    發(fā)表于 03-11 15:46

    CMOS電路的使用事項

    CMOS電路的使用事項
    發(fā)表于 12-17 01:36 ?561次閱讀
    CMOS電路的使<b class='flag-5'>用事項</b>

    C++中命名空間的幾大用法

    譯者注:可能很多程序員對C++已經(jīng)非常熟悉,但是對命名空間經(jīng)常使用到的地方還不是很明白,這篇文章就針對命名空間這一塊做了一個敘述。 命名
    發(fā)表于 09-28 18:31 ?0次下載

    python基礎(chǔ)教程之變量如何命名變量命名規(guī)范的資料說明

    python源碼和其他一些書籍,命名各種個性,沒有一個比較統(tǒng)一的命名規(guī)范。于是總結(jié)了一些,供參考。
    發(fā)表于 01-04 17:51 ?15次下載
    <b class='flag-5'>python</b>基礎(chǔ)教程之變量如何<b class='flag-5'>命名</b>變量<b class='flag-5'>命名</b>規(guī)范的資料說明

    Python公認(rèn)的命名規(guī)則總結(jié)

    對于模塊名/包名、函數(shù)名、變量名、類名、常量名的命名,Python有一些公認(rèn)的規(guī)則,具體如下。
    的頭像 發(fā)表于 01-23 11:25 ?1800次閱讀

    一文了解C++的命名空間

    在C++中,變量、函數(shù)和類都是大量存在的,這些變量、函數(shù)和類的名稱將都存在于全局命名空間中,會導(dǎo)致很多沖突, 使用命名空間的目的是對標(biāo)識符的名稱進行本地化,以避免
    的頭像 發(fā)表于 06-29 14:48 ?2350次閱讀
    一文了解C++的<b class='flag-5'>命名</b><b class='flag-5'>空間</b>

    詳解python常規(guī)包與命名空間

    python常規(guī)包與命名空間包 1. 常規(guī)包 在 Python 3.3 之前或者說 Python 2 中,一個包想要被導(dǎo)入使用,那么該包內(nèi)必
    的頭像 發(fā)表于 03-11 15:46 ?3449次閱讀

    Python模塊有哪些注意事項

    python導(dǎo)入模塊時從上到下執(zhí)行不在函數(shù)內(nèi)、不在類內(nèi)的代碼。
    的頭像 發(fā)表于 02-21 11:24 ?513次閱讀

    python變量命名規(guī)則

    Python是一種高級編程語言,廣泛應(yīng)用于軟件開發(fā)、數(shù)據(jù)分析和科學(xué)計算等領(lǐng)域。在Python中,變量是用來存儲數(shù)據(jù)的容器,它們具有名稱以及與之關(guān)聯(lián)的值。然而,變量的命名并不是隨意的,而是需要遵循一定
    的頭像 發(fā)表于 11-23 15:44 ?1562次閱讀