<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
模組通常為單獨的.py檔案,可以用import直接參照,可以作為模組的檔案型別有.py、.pyo、.pyc、.pyd、.so、.dll在匯入模組時,直譯器做以下工作:
import 語句可以在程式的任何位置使用,你可以在程式中多次匯入同一個模組,但模組中的程式碼僅僅在該模組被首次匯入時執行。後面的import語句只是簡單的建立一個到模組名稱空間的參照而已。sys.modules字典中儲存著所有被匯入模組的模組名到模組物件的對映。
多個相關聯的模組組成一個包,即多個.py檔案構成一個包,以便於維護和使用,同時能有限的避免名稱空間的衝突。一般來說,包的結構可以是這樣的:
package |- subpackage1 |- __init__.py |- a.py |- subpackage2 |- __init__.py |- b.py
有以下幾種匯入方式
import subpackage1.a # 將模組subpackage.a匯入全域性名稱空間,例如存取a中屬性時用subpackage1.a.attr from subpackage1 import a # 將模組a匯入全域性名稱空間,例如存取a中屬性時用a.attr_a from subpackage1.a import attr_a # 將模組a的屬性直接匯入到名稱空間中,例如存取a中屬性時直接用attr_a
使用from語句可以把模組直接匯入當前名稱空間,from語句並不參照匯入物件的名稱空間,而是將被匯入物件直接引入當前名稱空間
可以被import語句匯入的物件是以下型別:
__init__.py
檔案的作用就是將該檔案所處的資料夾當做一個模組來管理,每當有外部檔案來import
的時候,就會執行裡面的函數
__init__.py
是怎麼工作的
當一個目錄下含有這個檔案,則這個資料夾就是一個python模組,通常__init__.py
檔案為空,但是我們還可以為它增加其他的功能。我們在匯入一個包時,實際上是匯入了它的__init__.py
檔案。這樣我們可以在__init__.py
檔案中批次匯入我們所需要的模組,而不再需要一個一個的匯入。
當import匯入該模組時,同時會執行該檔案內容,當匯入該模組中的某個函數時需要加上該包名,不然就會報錯,如下,當在其他檔案中要匯入子包subpackage_1中的test11函數時,需要加上包名mypackage
from mypackage.subpackage_1 import test11
__init__.py
中還有一個重要的變數,__all__
, 它用來將模組全部匯入。
# __init__.py __all__ = ['os', 'sys', 're', 'urllib'] # a.py from package import *
這時就會把註冊在__init__.py
檔案中__all__
列表中的模組和包匯入到當前檔案中來。在瞭解了__init__.py
的工作原理後,應該能理解該檔案就是一個正常的python程式碼檔案。因此可以將初始化程式碼放入該檔案中。
.py檔案在組合時,會生成.pyc檔案,在組合時,會將.py檔案中的import的檔案連結起來組合成位元組碼寫到一個.pyc檔案中,後面執行時,就直接執行.pyc檔案,省去每次都要重新組合,提高執行速度,(當.py檔案的修改時間發生改變,這樣會生成新的.pyc檔案)在直譯器使用-O選項時,將使用同名的.pyo檔案,這個檔案去掉了斷言(assert)、斷行號以及其他偵錯資訊,體積更小,執行更快。(使用-OO選項,生成的.pyo檔案會忽略檔案資訊)
建構函式是一種特殊的類成員方法,主要用在建立物件時初始化物件
python中的建構函式用__init__命名
解構函式是建構函式的反函數,在銷燬物件時呼叫他們,往往用來做清理善後,
例如:資料庫連線物件可以在解構函式中釋放對資料庫範例資源的佔用
python中為類定義解構函式的方法是在類中定義一個名為__del__的沒有返回值和引數的函數
python中顯示銷燬物件的方法,使用del關鍵
python中支援兩種基於類名存取成員函數:靜態函數和類函數
不同點:類函數有一個隱形引數cls可以用來獲取類資訊
靜態函數使用裝飾器@staicmethod定義
類函數使用裝飾器@classmethod定義
__var__
下劃線字首的含義是告知其他程式設計師:以單個下劃線開頭的變數或方法僅供內部使用。 該約定在PEP 8中有定義。這不是Python強制規定的。 Python不像Java那樣在“私有”和“公共”變數之間有很強的區別。
如果使用萬用字元從模組中匯入所有名稱,則Python不會匯入帶有前導下劃線的名稱(除非模組定義了覆蓋此行為的__all__
列表)
# This is my_module.py: def external_func(): return 23 def _internal_func(): return 42
>>> from my_module import * >>> external_func() 23 >>> _internal_func() NameError: "name '_internal_func' is not defined"
與萬用字元匯入不同,常規匯入不受前導單個下劃線命名約定的影響:
>>> import my_module >>> my_module.external_func() 23 >>> my_module._internal_func() 42
有時候,一個變數的最合適的名稱已經被一個關鍵字所佔用。 因此,像class或def這樣的名稱不能用作Python中的變數名稱。 在這種情況下,你可以附加一個下劃線來解決命名衝突,總之,單個末尾下劃線(字尾)是一個約定,用來避免與Python關鍵字產生命名衝突。 PEP 8解釋了這個約定。
到目前為止,我們所涉及的所有命名模式的含義,來自於已達成共識的約定。 而對於以雙下劃線開頭的Python類的屬性(包括變數和方法),情況就有點不同了。雙下劃線字首會導致Python直譯器重寫屬性名稱,以避免子類中的命名衝突。這也叫做名稱修飾(name mangling) — 直譯器會更改變數的名稱,以便在類被擴充套件的時候不容易產生衝突。對於該屬性的呼叫可以通過方法呼叫,而不能直接呼叫該屬性,類似實現屬性的私有,例如:
class ManglingTest: def __init__(self): self.__mangled = 'hello' def get_mangled(self): return self.__mangled >>> ManglingTest().get_mangled() # 通過方法獲取該函數的值 'hello' >>> ManglingTest().__mangled # 直接呼叫該屬性時會報錯 AttributeError: "'ManglingTest' object has no attribute '__mangled'"
但我們依然可以通過特殊方法來直接獲取該屬性的值,即通過(_類名__屬性)的方式獲取,例如
>>> ManglingTest()._ManglingTest__mangled 'hello'
所以在python中並沒有真正的私有變數,python直譯器會自動將__var修飾為: _類名__屬性
,該特性對於以雙下劃線開頭的方法依然適用
class MangledMethod: def __method(self): return 42 def call_it(self): return self.__method() >>> MangledMethod().__method() # 直接呼叫該方法會報錯 AttributeError: "'MangledMethod' object has no attribute '__method'" >>> MangledMethod().call_it() 42 >>> MangledMethod()._MangledMethod__method() # 通過該形式也是可以呼叫該方法 42
如果一個名字同時以雙下劃線開始和結束,則不會應用名稱修飾。不同於僅有雙下滑線開頭的變數或函, 由雙下劃線字首和後雙下滑線包圍的變數不會被Python直譯器修改,但是,Python保留了有雙前導和雙末尾下劃線的名稱,用於特殊用途。 這樣的例子有,__init__
(物件建構函式),或__call__
(該函數是使得一個物件可以被呼叫)最好避免在自己的程式中使用以雙下劃線開頭和結尾的名稱,以避免與將來Python語言的變化產生衝突。
按照習慣,有時候單個獨立下劃線是用作一個名字,來表示某個變數是臨時的或無關緊要的。
例如,在下面的迴圈中,我們不需要存取正在執行的索引,我們可以使用“_”來表示它只是一個臨時值:
>>> for _ in range(32): ... print('Hello, World.') >>> car = ('red', 'auto', 12, 3812.4) >>> color, _, _, mileage = car >>> color 'red' >>> mileage 3812.4 >>> _ 12
到此這篇關於python中特殊檔案和特殊函數的文章就介紹到這了,更多相關python特殊檔案和特殊函數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45