PYTHON小白 第十五天

2021-10-01 12:47:33 字數 1804 閱讀 9691

python小白:第十五天

1、 再論類命名空間

python的類就像命名空間。python程式預設處於全域性命名空間內,類體則處於類命名空間內,python允許在全域性範圍內放置可執行**–當python執行該程式時,這些**就會獲得執行的機會;類似地,python同樣允許在類範圍內放置可執行**–當python執行該類定義時,這些**同樣會獲得執行的機會。

下面**示範了在全域性空間和類命名空間內分別定義lambda表示式。

全域性空間內定義的lambda表示式就相當於乙個普通函式,因此程式使用呼叫函式的方式來呼叫該lambda表示式,並顯式地為第乙個引數繫結引數值,

對於在類命名空間內定義的lambda表示式,則相當於在該類命名空間中定義了乙個函式,這個函式就變成了例項方法,因此程式必須使用呼叫方法的方式來呼叫該lambda表示式,python這樣會為該方法的第乙個引數(相當於self數)繫結引數值。

2、 成員變數

在類體內定義的變數,預設屬於類本身,如果把類當成類命名空間,那麼該類變數其實就是定義在類命名空間內的變數。

2.1類變數和例項變數

在類命名空間內定義的變數就屬於類變數,python可以使用類來讀取、修改類變數。

對於類變數而言,它們就是屬於在類命名空間內定義的變數,因此程式不能直接訪問這些變數,程式必須使用類名來呼叫類變數。不管是在全域性範圍內還是函式內訪問這些類變數,都必須使用類名進行訪問。

實際上,python完全允許使用物件來訪問該物件所屬類的類變數(當然還是推薦使用類訪問類變數)。

由於通過物件訪問類變數的本質還是通過類名訪問,因此如果類變數發生了改變,當程式訪問這些類變數時也會讀到修改之後的值。

python允許通過物件訪問類變數,但如果程式通過物件嘗試對類變數賦值,此時性質就變了–python是動態語言,賦值語句往往意味著定義新變數。

因此,如果程式通過物件對類變數賦值,其實不是對「類變數賦值」,而是定義新的例項變數。

如果程式通過類修改了兩個類變數的值,程式中inventory的例項變數的值也不會受到任何影響。

同樣,如果程式對乙個物件的例項變數進行了修改,這種修改也不會影響類變數和其他物件的例項變數。

2.2使用property函式定義屬性

如果為python類定義了getter、setter等訪問器方法,則可使用property()函式將它們定義成屬性(相當於例項變數)。

property()函式的語法格式如下:

從上面的語法格式可以看出,在使用property()函式時,可傳入四個引數,分別代表getter方法、setter方法、del方法和doc,其中doc是乙個文件字串,用於說明該屬性。當然,開發者呼叫property可傳入0個(既不能讀,也不能寫的屬性)、1個(唯讀屬性)、2個(讀寫屬性)、3個(讀寫屬性,也可刪除)和4個(讀寫屬性,也可刪除,包含文件說明)引數。

在使用property()函式定義屬性時,可根據需要只少量的引數。

在某些程式語言中,類似於這種property合成的屬性被稱為計算屬性。這種屬性並不真正儲存任何狀態,它的值其實是通過某種演算法計算得到的,當程式對該屬性賦值時,被賦的值也會被儲存到其他例項變數。

還可使用@property裝飾器來修飾方法,使之成為屬性。

當程式使用@property修飾了state屬性之後,又多了乙個@ state.setter裝飾器,該裝飾器用於修飾state屬性的setter方法.這樣state屬性就有了getter和setter方法,state屬性就變成了讀寫屬性。

使用@property修飾了is_dead方法,該方法就會變成is_dead屬性的getter方法,此處同樣會多出乙個@is_dead.setter裝飾器,但程式並未使用該裝飾器修飾setter方法,因此dead屬性只是乙個唯讀屬性。

python第十五天

什麼是模組?一系列功能的集合 定義模組?建立乙個py檔案就是乙個模組,該py檔名就是模組名 怎麼使用模組?在要是用的模組檔案中通過import 模組名 來匯入模組 模組的四種方式?1 編譯執行模組所對應的py檔案,形成對應的pyc檔案 2 產生該模組自己的全域性命名空間 3 在適應該模組的全域性命名...

LinuxC 第十五天

靜態庫 靜態庫 要被包含到源程式中的庫 優點 執行速度快 缺點 占用系統資源比較多 使用的場合 對時間要求很高的場合 靜態庫的製作 1 把所有的源程式 c檔案 製作成目標檔案 o 檔案 gcc c mul.c o mul.o gcc c sub.c o sub.o gcc c add.c o add...

Qt第十五天

qwdialogsize.h ifndef qwdialogsize h define qwdialogsize h include namespace ui class qwdialogsize public qdialog endif qwdialogsize hqwdialogsize.cpp...