Python魔法方法(magic method)細解幾個常用魔法方法(下)

接上文,再介紹最后幾個常用的魔法方法。

?

關于__dict__:

先上個例子:

class Test(object):fly = Truedef __init__(self, age):self.age = age

?

__dict__魔法方法可以被稱為系統,他是存儲各分層屬性的魔法方法。__dict__中,鍵為屬性名,值為屬性本身。可以這樣理解,在平時我們給類和實例定義的那些屬性,都會被存儲到__dict__方法中用于讀取。而我們平時使用的類似這樣的語法Test.fly 其實就是調用了類屬性,同樣可以寫成Test.__dict__['fly']。除了類屬性,還有實例屬性。當我們用類實例化一個實例,例如上文我們使用p = Test(2)實例化類Test,p也會具有__dict__屬性。這里會輸出:

?

{'age': 2}

?

由上可以發現,python中的屬性是進行分層定義的。/object/Test/p這樣一層一層下來的。當我們需要調用某個屬性的時候,python會一層一層往上面遍歷上去。先從實例,然后實例的__class__的__dict__,然后是該類的__base__。這樣__dict__一路找上去。如果最后都沒有找到,就拋出AttributeError錯誤。

這里可以延伸一下,沒記錯的話,我前面有篇文章講了一個方法__slot__。__slots__方法就是通過限制__dict__,只讓類實例初始化__slots__里面定義的屬性,而且讓實例不再擁有__dict__方法,來達到節約內存的目的。我將會就上面的那個例子重寫一下,來說明這個問題。

?

 class Test(object):__slots__ = ['age']fly = Truedef __init__(self, age):self.age = age

?

output:

In [25]: Test.__dict__
Out[25]:
dict_proxy({'__doc__': None,'__init__': <function __main__.__init__>,'__module__': '__main__','__slots__': ['age'],'age': <member 'age' of 'Test' objects>,'fly': True})In [36]: p.__dict__
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-36-3a1cec47d020> in <module>()
----> 1 p.__dict__AttributeError: 'Test' object has no attribute '__dict__'In [37]: p.age
Out[37]: 3In [38]: p.fly
Out[38]: True

可以看到,__slots__方法并沒有阻止由下至上的屬性查找方法,只是不會再允許沒有包含在__slots__數組中的屬性再被賦值給實例了。但這并不妨礙,繼續調用允許訪問的屬性,以及類屬性。

?

關于__get__, __set__, __del__:

在前面的文章里面我也介紹過這三個魔法方法,雖然一般是用不到的,但是在寫庫的時候它們有特別的用途。他們是python另外一個協議descriptor的根基。

同一個對象的不同屬性之間可能存在依賴關系。當某個屬性被修改時,我們希望依賴于該屬性的其他屬性也同時變化。在這種環境下面__dict__方法就無法辦到。因為__dict__方法只能用來存儲靜態屬性。python提供了多種即時生成屬性的方法。其中一種就是property。property是特殊的屬性。比如我們為上面的例子增加一個property特性,使得他能夠動態變化。來看這個例子:

class Test(object):fly = Truedef __init__(self, age):self.age = agedef whether_fly(self):if self.age <= 30:return Trueelse:return Falsedef just_try_try(self, other):passwhether_fly = property(whether_fly)p = Test(20)
print p.age
print p.whether_fly
p.age = 40
print p.age
print p.whether_fly

output:

20
True
40
False

可以看到 我們可以使用這種手段,動態修改屬性值。property有四個參數。前三個參數為函數,分別用于處理查詢特性、修改特性、刪除特性。最后一個參數為特性的文檔,可以為一個字符串,起說明作用。這里我只是要到了第一個參數,查詢的時候動態修改他的返回值,而第二個參數是在修改值的時候就會體現出來。

?

Reference:

http://www.cnblogs.com/vamei/archive/2012/12/11/2772448.html

?

轉載于:https://www.cnblogs.com/piperck/p/6362203.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371589.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371589.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371589.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AIX下RAC搭建 Oracle10G(六)dbca建庫

AIX下RAC搭建系列 AIX下RAC搭建 Oracle10G&#xff08;六&#xff09;dbca建庫 環境 節點 節點1 節點2 小機型號 IBM P-series 630 IBM P-series 630 主機名 AIX203 AIX204 交換機 SAN光纖交換機 存儲 SAN T3存儲 大綱流程例如以下&#xff1a; 第一部分&#xff1…

php string slice,substring()與str.slice()區別

當接收的參數是負數時&#xff0c;slice會將它字符串的長度與對應的負數相加&#xff0c;結果作為參數&#xff1b;substr則僅僅是將第一個參數與字符串長度相加后的結果作為第一個參數&#xff1b;substring則干脆將負參數都直接轉換為0。測試代碼如下&#xff1a;var test h…

JavaOne 2012:掌握Java部署

在吃完一次JavaClass 2012午餐會的意大利經典組合后&#xff0c;我前往希爾頓帝國宴會廳B觀看了演示“掌握Java部署”。 來自Oracle的發言人是Mark Howe和Igor Nekrestyano Howe表示&#xff0c;部署團隊的目標是幫助Java開發人員將其應用程序部署到所選平臺。 他首先討論了“功…

數組刪除奇數編號的數據求最后的元素

//abcd...s 這19個字符循環106次成一個長度2014的字符串&#xff0c;然后刪除第奇數個&#xff0c;得到小串&#xff0c;再刪&#xff0c;最后的字符是&#xff1f; #define _CRT_SECURE_NO_DEPRECATE #include<stdio.h> #include<windows.h> #include<string.…

php 提高吞吐量,如何提高網站的吞吐量

吞吐量定義百科吞吐量是指對網絡、設備、端口、虛電路或其他設施&#xff0c;單位時間內成功地傳送數據的數量(以比特、字節、分組等測量)。以上的定義比較寬泛&#xff0c;定義到網站或者接口的吞吐量是這樣的&#xff1a;吞吐量是指系統在單位時間內處理請求的數量。這里有一…

ubuntu下如何查找某個文件的路徑

1.whereis 文件名 特點:快速,但是是模糊查找,例如 找 #whereis mysql 它會把mysql,mysql.ini,mysql.*所在的目錄都找出來. 2.find / -name 文件名 特點:準確,但速度慢,消耗資源大,例如我想找到PHP.ini的準確位置,就需要用 #find / -name php.ini 3.locate 文件名 強力推薦的方…

事件的學習

1.鼠標單擊事件( onclick &#xff09;: onclick是鼠標單擊事件&#xff0c;當在網頁上單擊鼠標時&#xff0c;就會發生該事件。同時onclick事件調用的程序塊就會被執行&#xff0c;通常與按鈕一起使用。 <!DOCTYPE HTML> <html> <head> <meta http-equiv…

使用您自己的規則在Eclipse中自定義PMD

PMD是非常好的Java代碼掃描程序&#xff0c;可幫助您避免潛在的編程問題。 它可以輕松擴展以滿足您的需求&#xff0c;并且本文將為您帶來與JPA的Enumerated注釋用法相關的自定義PMD規則的簡單示例。 在繼續閱讀之前&#xff0c;您應該檢查我以前的文章之一-JPA-Enumerated def…

切換oracle用戶impdp,Oracle 12c pdb使用expdp/impdp導入導出

12c推出了可插拔數據庫&#xff0c;在一個容器cdb中以多租戶的形式同時存在多個數據庫pdb。在為pdb做數據泵導入導出時和傳統的數據庫有少許不同。1&#xff0c;需要為pdb添加tansnames2&#xff0c;導入導出時需要在userid參數內指定其tansnames的值&#xff0c;比如 useridus…

搭建mysql集群,使用Percona XtraDB Cluster搭建

Percona XtraDB Cluster提供的特性有&#xff1a;1.同步復制&#xff0c;事務要么在所有節點提交或不提交。2.多主復制&#xff0c;可以在任意節點進行寫操作。3.在從服務器上并行應用事件&#xff0c;真正意義上的并行復制。4.節點自動配置。5.數據一致性&#xff0c;不再是異…

使用NoSQL實現實體服務–第4部分:Java EE

現在&#xff0c;我已經準備好了框架式的合同優先型Web服務&#xff0c;并使用Ektorp和CouchDB創建了數據訪問層 &#xff0c;是時候將它們連接到一個可以正常工作的實體服務中了 。 為此&#xff0c;我將使用Java EE和Glassfish 3.1。 值得注意的是&#xff0c;對于他的那種R&…

yii2之DetailView小部件

DetailView小部件用于展示單條數據記錄&#xff0c;可配置屬性很少&#xff0c;使用也很簡單&#xff0c;直接貼代碼&#xff0c;一看就懂&#xff01; yii小部件數據小部件DetailView的使用示例&#xff1a; <? DetailView::widget([model > $user,//模型對象&#xff…

克隆安裝oracle,Oracle 之 Cloning $oracle_home (克隆安裝oracle軟件)

用途&#xff1a;Cloning an Oracle Home &#xff0c; 可以免去多臺機器重復安裝oracle軟件1、停止相關進程[rootnode1 bin]# ./crsctl stop cluster -all2、打包 dbhome_1 目錄[rootnode1 11.2.0]# cd /u01/app/oracle/product/11.2.0/[rootnode1 11.2.0]# tar -zcvpf db_1.b…

gitlab的安裝和基本維護

基本介紹 GitLab是一個自托管的Git項目倉庫&#xff0c;可以自己搭建個人代碼管理的倉庫&#xff0c;功能與github類似。 安裝 操作系統&#xff1a;CentOS6.5 gitlab官網下載安裝地址&#xff1a;https://about.gitlab.com/downloads/#centos6 1.安裝依賴的包 yum install cur…

Spring配置文件和Java配置

我的上一個博客介紹了Spring 3.1的配置文件&#xff0c;并解釋了使用它們的業務案例&#xff0c;并演示了它們在Spring XML配置文件中的用法。 但是&#xff0c;似乎很多開發人員更喜歡使用Spring的基于Java的應用程序配置&#xff0c;因此Spring設計了一種使用帶有現有Configu…

php 刪除單個文件大小,php刪除指定大小的jpg文件

function actionZmdel(){//set_time_limit(0);$dir dirname(dirname(dirname(dirname(__FILE__))))./2012jxgwyimg;$dirarr scandir($dir);echo 正在刪除...;foreach($dirarr as $subdir){if($subdir ! . && $subdir ! ..){$path $dir./.$subdir;$files glob($path…

2017寒假零基礎學習Python系列之函數之 函數之定義可變參數

若想讓函數接受任意個參數&#xff0c;就可以定義一個可變的參數&#xff1a; def fn(*args): print args fn() >>>() fn(1,2,5,6) >>>(1,2,5,6) 原理是Python解釋器把傳入的一組參數封裝在一個tuple傳遞給可變參數&#xff0c;因此在函數內部&#xff0c;直…

在Windows上構建OpenJDK

通過做一些實驗&#xff0c;我發現手頭提供JDK源代碼來進行一些更改&#xff0c;使用它等等通常很有用。因此&#xff0c;我決定下載并編譯該野獸。 顯然&#xff0c;這花了我一些時間&#xff0c;盡管我最初的想法是&#xff0c;它應該和運行make命令一樣簡單&#xff1a;&…

unity中怎么在InspectorI面板加LOGO

轉載于:https://www.cnblogs.com/unitySPK/p/7278925.html

oracle stream 主鍵,oracle stream配置向導

1. Stream 的工作原理Stream 是Oracle Advanced Queue技術的一種擴展應用&#xff0c;這種技術最基本的原理就是收集事件&#xff0c;把時間保存在隊列中&#xff0c;然后把這些事件發布給不同的訂閱者。從DBA的角度來說&#xff0c;就是把捕獲Oracle數據庫產生的Redo日志&…