python的類和對象——類成員番外篇


  學完了面向對象的三大特性,已經get了所有屌絲技能的我們也當一回文藝小青年,來看看類的成員和成員修飾符。

  今天‘三’這個數字好親和~~~類成員可以分為三類:字段、方法和屬性

一、字段

  首先我們來看看字段,先上圖:

        

  我們看上面左側這張圖,第二個黃框框里面的字段我們見過的,以前也一直是這么用的,我們叫它普通字段,在使用的時候我們使用 對象名.字段名 的方法就可以調用,那么第一個的黃框框里的靜態字段又是怎么一回事呢?我們可以看出,它是一個屬於類的變量,並不是只屬於一個對象,而是屬於一個類,那么靜態字段和普通字段在實際意義上有什么區別呢?我們來看旁邊的例子。中間的圖是我們調用左邊類中變量的代碼,右邊是執行結果,首先普通字段的使用方式和以前一樣,而靜態字段,我們發現他有兩種調用方式:

一、對象名.字段名 二、類名.字段名。從上例中我們可以看出,使用 對象名.字段名 的方法對字段的值進行修改,我們只是修改了該對象的字段內容,並不會影響其他對象及類變量本身,如果使用 類名.字段名 的方式進行修改,則只是修改了該類的字段內容,其他對象不會受到影響。

  我們從內存的角度來看這個問題,當我們使用類名.字段名去調用靜態變量的時候,這個變量是存在類的內存中的,這個時候各個對象都可以取到類的內存中的變量,但是當我們使用對象名.字段名去修改這個靜態變量的時候,我們其實是在對象的內存中又開辟了一塊空間去存儲這個字段和修改后的值,所以一個對象的字段發生改變,類和其他對象的該字段並不會發生變化。哎呦,總之解決這個問題的最終辦法就是始終用 類名.字段名 去使用類中的靜態變量就對了!

  

 

 1 #!/usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 class father(object):
 4 
 5     #靜態字段
 6     money = 10000
 7     def __init__(self,name,salary):
 8 
 9         #普通字段
10         self.name = name
11         self.salary = salary
12 
13 
14 dad1 = father('dad1',6000)
15 dad2 = father('dad2',7000)
16 
17 dad1.salary += 1000
18 dad2.salary += 1000
19 print 'dad1.salary:',dad1.salary
20 print 'dad1.salary:',dad2.salary
21 print '*'*20
22 dad1.money += 1000
23 dad2.money += 1000
24 print 'father.money : ',father.money
25 print 'dad1.money : ',dad1.money
26 print 'dad2.money : ',dad2.money
27 print '*'*20
28 father.money += 1000
29 print 'father.money : ',father.money
30 print 'dad1.money : ',dad1.money
31 print 'dad2.money : ',dad2.money
example Code

 

二、方法

  方法包括:普通方法、靜態方法和類方法,三種方法在內存中都歸屬於類,區別在於定義和調用的方式不同。

  • 普通方法:由對象調用;至少一個self參數;執行普通方法時,自動將調用該方法的對象賦值給self
  • 類方法:由調用; 至少一個cls參數;執行類方法時,自動將調用該方法的復制給cls
  • 靜態方法:由調用;無默認參數;

  

  我們看上面的兩張圖,實現的是同樣的功能,左圖是使用普通方法,右圖則使用了類方法和靜態方法,我們可以發現,這兩個方法中都沒有使用到對象本來的屬性,這個時候如果還需要再給類進行初始化然后再用 對象名.方法名 的方法去進行調用,就會顯得非常繁瑣了,這個時候我們就可以使用類變量和靜態變量來完成,只要加上@classmethod或@staticmethod修飾符,就可以將普通方法變成類方法或者靜態方法。需要注意的是:類方法至少有一個參數,那就是這個類本身,用cls表示,不要問為什么,背下來就好。。。而靜態方法不需要傳對象也不需要傳類參數,就像個普通的函數一樣用就對了!這兩個方法都是用 類名.方法名來調用,所以自然地也就可以使用 類變量,但是卻不能訪問對象的變量,原因你懂的,因為他根本就沒有接收到對象參數,所以也就找不到對象中的內容啦~

三、屬性

  如果你已經了解Python類中的方法,那么屬性就非常簡單了,因為Python中的屬性其實是普通方法的變種。

  

  哎,其實就是這樣,我們看一下當我們想查看稅后工資的時候,這其實是一個人的屬性,但是它卻要經過一些特殊的處理或者計算,讓我們必須寫在一個方法里,這個時候我們使用@property這個修飾符,就可以像使用字段一樣調用這個方法了。對,屬性是處女座就是這么矯情!!!當然如果你和我一樣是神經大條的射手座,完全不用care這個屬性什么鬼的。

  盡管如此,在這里還是要說一說要注意一下幾點:

    1.定義時,在普通方法的基礎上添加 @property 裝飾器;

    2.定義時,屬性僅有一個self參數

    3.調用時,無需括號

  未完。。。

參考:http://www.cnblogs.com/wupeiqi/articles/5017742.html

 

 1 #!/usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 class father(object):
 4 
 5     #靜態字段
 6     money = 10000
 7     def __init__(self,name,salary):
 8 
 9         #普通字段
10         self.name = name
11         self.salary = salary
12 
13     @property
14     def Net_pay(self):
15         '''屬性'''
16         netPay = self.salary - ((self.salary- 3500)*0.1)
17         return netPay
18 
19 dad1 = father('dad1',6000)
20 print dad1.Net_pay
@property Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM