python類及其方法

来源:http://www.cnblogs.com/panwenbin-logs/archive/2016/07/02/5634788.html
-Advertisement-
Play Games

python類及其方法 一、介紹 在 Python 中,面向對象編程主要有兩個主題,就是類和類實例類與實例:類與實例相互關聯著:類是對象的定義,而實例是"真正的實物",它存放了類中所定義的對象的具體信息。 類有這樣一些的優點: 二、類的定義 1.定義類(class)的語法 一第行,語法是class ...


                 python類及其方法

一、介紹

在 Python 中,面向對象編程主要有兩個主題,就是類和類實例
類與實例:
類與實例相互關聯著:類是對象的定義,而實例是"真正的實物",它存放了類中所定義的對象
的具體信息。

類有這樣一些的優點:

1、類對象是多態的:也就是多種形態,這意味著我們可以對不同的類對象使用同樣的操作方法,而不需要額外寫代碼。
2、類的封裝:封裝之後,可以直接調用類的對象,來操作內部的一些類方法,不需要讓使用者看到代碼工作的細節。
3、類的繼承:類可以從其它類或者元類中繼承它們的方法,直接使用。

二、類的定義

1.定義類(class)的語法

1 >>> class Iplaypython:
2 >>>     def fname(self, name):
3 >>>           self.name = name

一第行,語法是class 後面緊接著,類的名字,最後別忘記“冒號”,這樣來定義一個類。
類的名字,首字母,有一個不可文的規定,最好是大寫,這樣需要在代碼中識別區分每個類。
第二行開始是類的方法,大家看到了,和函數非常相似,但是與普通函數不同的是,它的內部有一個“self”,參數,它的作用是對於對象自身的引用。

2.初始化對象

創建類時,可以定義一個特定的方法,名為__init__(),只要創建這個類的一個實例就會運行這個方法。可以向__init__()方法傳遞參數,這樣創建對象時就可以把屬性設置為你希望的值__init__()這個方法會在創建對象時完成初始化

1 >>> class peo:
2 ...     def __init__(self,name,age,sex):
3 ...             self.Name = name
4 ...             self.Age = age
5 ...             self.Sex = sex
6 ...     def speak(self):
7 ...             print "my name" + self.Name
8 ... 

實例化這個類的對象時:

1 >>> zhangsan=peo("zhangsan",24,'man')
2 >>> print zhangsan.Age
3 24
4 >>> print zhangsan.Name
5 zhangsan
6 >>> print zhangsan.Sex
7 man

之前多次用到self這個形參類就好比是一張藍圖,使用一個類可以創建多個對象實例,speak()方法在被調用時,必須知道是哪個對象調用了它.

這裡self參數就會告訴方法是哪個對象來調用的.這稱為實例引用。

 

3.類的私有屬性:

  __private_attrs 兩個下劃線開頭,聲明該屬性為私有,不能在類地外部被使用或直接訪問。在類內部的方法中使用時 self.__private_attrs
類的方法
  在類地內部,使用def關鍵字可以為類定義一個方法,與一般函數定義不同,類方法必須包含參數self,且為第一個參數
私有的類方法
  __private_method 兩個下劃線開頭,聲明該方法為私有方法,不能在類地外部調用。在類的內部調用slef.__private_methods

 

4. classmethod類方法

1) 在python中.類方法 @classmethod 是一個函數修飾符,它表示接下來的是一個類方法,而對於平常我們見到的則叫做實例方法。 類方法的第一個參數cls,而實例方法的第一個參數是self,表示該類的一個實例。
2) 普通對象方法至少需要一個self參數,代表類對象實例
3)類方法有類變數cls傳入,從而可以用cls做一些相關的處理。並且有子類繼承時,調用該類方法時,傳入的類變數cls是子類,而非父類。 對於類方法,可以通過類來調用,就像C.f(),有點類似C++中的靜態方法, 也可以通過類的一個實例來調用,就像C().f(),這裡C(),寫成這樣之後它就是類的一個實例了。

 1 class info(object):
 2 
 3   @classmethod
 4   def sayclassmethod(cls):
 5 
 6     print 'say %s' % cls
 7 
 8   def saymethod(self):
 9 
10     print 'say %s' % self
11 
12 
13 test = info()
14 test.saymethod()##實例調用方法
15 test.sayclassmethod()##實例調用類方法
16 info.saymethod(test)##類調用實例方法
17 info.sayclassmethod()##類調用類方法

大家對比運行下。

 

5.類的裝飾器@property

 1 class Pager:
 2     def __init__(self,all_count):
 3         self.all_count=all_count
 4     @property
 5     def all_pager(self):
 6         a,b=divmod(self.all_count,10)
 7         if a==0:
 8             return a
 9         else:
10             return  a+1
11 
12     @all_pager.setter
13     def all_pager(self,value):
14         print(value)
15 
16     @all_pager.deleter
17     def all_pager(self):
18         print('hehe')
19 p=Pager(101)
20 ret=p.all_count#以訪問類屬性的方法訪問對象的方法
21 print(ret)

下麵看第二種方法

 1 class Pager:
 2     def __init__(self,all_count):
 3         self.all_count=all_count
 4     def f1(self):
 5         return 123
 6     def f2(self,value):
 7         print('======')
 8     def f3(self):
 9         print('+++++++')
10 
11     foo=property(fget=f1,fset=f2,fdel=f3)
12 p=Pager(101)
13 ret=p.foo
14 p.foo='alex'
15 print(p.foo)
16 del p.foo

在該類中定義三個函數,分別用作賦值、取值、刪除變數

property函數原型為property(fget=None,fset=None,fdel=None,doc=None),上例根據自己定義相應的函數賦值即可。

 

 

三、繼承類定義:
1.單繼承

class <類名>(父類名)
<語句>

1 class childbook(book)
2     age = 10

#單繼承示例

 1  class student(people):  
 2         grade = ''  
 3         def __init__(self,n,a,w,g):  
 4             #調用父類的構函  
 5             people.__init__(self,n,a,w)  
 6             self.grade = g  
 7         #覆寫父類的方法  
 8         def speak(self):  
 9             print("%s is speaking: I am %d years old,and I am in grade %d"%(self.name,self.age,self.grade))       
10 
11     s = student('ken',20,60,3)  
12     s.speak()

 

2.類的多重繼承
class 類名(父類1,父類2,....,父類n)
<語句1>

需要註意圓括弧中父類的順序,若是父類中有相同的方法名,而在子類使用時未指定,python從左至右搜索,即方法在子類中未找到時,從左到右查找父類中是否包含方法

#另一個類,多重繼承之前的準備  

1 class speaker():  
2     topic = ''  
3     name = ''  
4     def __init__(self,n,t):  
5         self.name = n  
6         self.topic = t  
7     def speak(self):  
8         print("I am %s,I am a speaker!My topic is %s"%(self.name,self.topic))  

#多重繼承  

1 class sample(speaker,student):  
2     a =''  
3     def __init__(self,n,a,w,g,t):  
4         student.__init__(self,n,a,w,g)  
5         speaker.__init__(self,n,t)  
6 
7 test = sample("Tim",25,80,4,"Python")  
8 test.speak()#方法名同,預設調用的是在括弧中排前地父類的方法

 

 

四、類的專業方法

Python 類可以定義專用方法,專用方法是在特殊情況下或當使用特別語法時由 Python 替你調用的,而不是在代碼中直接調用(象普通的方法那樣)。

1 __init__
類似於構造函數

1 #!/usr/local/bin/python
2 class Study:
3         def __init__(self,name=None):
4                 self.name = name
5         def say(self):
6                 print self.name
7 study = Study("Badboy")
8 study.say()

2 __del__
類似於析構函數

 1 #!/usr/local/bin/python
 2 class Study:
 3         def __init__(self,name=None):
 4                 self.name = name
 5         def __del__(self):
 6                 print "Iamaway,baby!"
 7         def say(self):
 8                 print self.name
 9 study = Study("zhuzhengjun")
10 study.say()

3__repr__
使用repr(obj)的時候,會自動調用__repr__函數,該函數返回對象字元串表達式,
用於重建對象,如果eval(repr(obj))會得到一個對象的拷貝。

 1 #!/usr/local/bin/python
 2 class Study:
 3         def __init__(self,name=None):
 4                 self.name = name
 5         def __del__(self):
 6                 print "Iamaway,baby!"
 7         def say(self):
 8                 print self.name
 9         def __repr__(self):
10                 return "Study('jacky')"
11 study = Study("zhuzhengjun")
12 study.say()
13 print type(repr(Study("zhuzhengjun"))) # str
14 print type(eval(repr(Study("zhuzhengjun")))) # instance
15 
16 study = eval(repr(Study("zhuzhengjun")))
17 
18 study.say()

4__str__
Python能用print語句輸出內建數據類型。有時,程式員希望定義一個類,要求它的對象也能用print語句輸出。Python類可定義特殊方法__str__,為類的對象提供一個不正式的字元串表示。如果類的客戶程式包含以下語句:

print objectOfClass
那麼Python會調用對象的__str__方法,並輸出那個方法所返回的字元串。

 1 #!/usr/local/bin/python
 2 
 3 class PhoneNumber:
 4         def __init__(self,number):
 5                  self.areaCode=number[1:4]
 6                  self.exchange=number[6:9]
 7                  self.line=number[10:14]
 8 
 9         def __str__(self):
10                 return "(%s) %s-%s"%(self.areaCode,self.exchange,self.line)
11 
12 def test():
13          newNumber=raw_input("Enter phone number in the form. (123) 456-7890: \n")
14          phone=PhoneNumber(newNumber)
15          print "The phone number is:"
16          print phone
17 
18 if__name__=="__main__":
19          test()

方法__init__接收一個形如"(xxx) xxx-xxxx"的字元串。字元串中的每個x都是電話號碼的一個位數。方法對字元串進行分解,並將電話號碼的不同部分作為屬性存儲。

方法__str__是一個特殊方法,它構造並返回PhoneNumber類的一個對象的字元串表示。解析器一旦遇到如下語句:

print phone

就會執行以下語句:

print phone.__str__()

程式如果將PhoneNumber對象傳給內建函數str(如str(phone)),或者為PhoneNumber對象使用字元串格式化運算符%(例如"%s"%phone),Python也會調用__str__方法。

5__cmp __
比較運算符,0:等於 1:大於 -1:小於

class Study:  
     def __cmp__(self, other):  
         if other > 0 :  
             return 1  
         elif other < 0:  
             return - 1  
         else:  
             return 0  
   
study = Study()  
if study > -10:print 'ok1'  
if study < -10:print 'ok2'  
if study == 0:print 'ok3' 

列印:ok2 ok3
說明:在對類進行比較時,python自動調用__cmp__方法,如-10 < 0 返回 -1,也就是說study 應該小與 -10,估列印ok2

6__getitem__
__getitem__ 專用方法很簡單。象普通的方法 clear,keys 和 values 一樣,它只是重定向到字典,返回字典的值。

 1 class Zoo:  
 2      def __getitem__(self, key):  
 3          if key == 'dog':return 'dog'  
 4          elif key == 'pig':return  'pig'  
 5          elif key == 'wolf':return 'wolf'  
 6          else:return 'unknown'  
 7    
 8 zoo = Zoo()  
 9 print zoo['dog']  
10 print zoo['pig']  
11 print zoo['wolf']

列印 dog pig wolf

7__setitem__
__setitem__ 簡單地重定向到真正的字典 self.data ,讓它來進行工作。

 1 class Zoo:  
 2      def __setitem__(self, key, value):  
 3          print 'key=%s,value=%s' % (key, value)  
 4    
 5 zoo = Zoo()  
 6 zoo['a'] = 'a'  
 7 zoo['b'] = 'b'  
 8 zoo['c'] = 'c'
 9 列印:
10 key=a,value=a
11 key=b,value=b
12 key=c,value=c

8 __delitem__
__delitem__ 在調用 del instance[key] 時調用 ,你可能記得它作為從字典中刪除單個元素的方法。當你在類實例中使用 del 時,Python 替你調用 __delitem__ 專用方法。

1 class A:  
2      def __delitem__(self, key):  
3          print 'delete item:%s' %key  
4    
5 a = A()  
6 del a['key'] 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...
  • 題目:統計一個數字在排序數組中出現的次數。例如,輸入排序數組{1,2,3,3,3,3,4,5}和數字3,由於3在這個數組中出現了4次,因此輸出4. 思路1:該解法是最直觀的解法,可以先使用二分查找先找到這個元素,然後分別向左和向右遍歷,把左右相同的元素的個數都計算出來。 思路2:使用二分查找的拓展, ...
  • 轉載自http://www.infoq.com/cn/articles/netty-high-performance 1. 背景 1.1. 驚人的性能數據 最近一個圈內朋友通過私信告訴我,通過使用Netty4 + Thrift壓縮二進位編解碼技術,他們實現了10W TPS(1K的複雜POJO對象)的... ...
  • 懶人記錄 Hadoop2.7.1 集群搭建過程 2016-07-02 13:15:45 總結 除了配置hosts ,和免密碼互連之外,先在一臺機器上裝好所有東西 配置好之後,拷貝虛擬機,配置hosts和免密碼互連 之前在公司裝的時候jdk用的32位,hadoop的native包不能正常載入,浪費好多 ...
  • 開頭話: 網站,說實話,是第一次做,也就直接選擇了ThinkPHP這個開源框架。選擇這個框架的原因。。。已經不記得了 貌似在我當時的認知中只有這個了,其它更優秀的框架也是這個畢業設計做到後期再去瞭解的。想起來了,是覺得相對 於使用java開發web,感覺php的直接可解析性更加方便於開發,能讓我節省 ...
  • 在這之前寫過關於java讀,寫Excel的blog如下: Excel轉Html java的poi技術讀,寫Excel[2003-2007,2010] java的poi技術讀取Excel[2003-2007,2010] java的poi技術讀取Excel數據到MySQL java的jxl技術導入Exc ...
  • 模塊,用一坨代碼實現了某個功能的代碼集合。 類似於函數式編程和麵向過程編程,函數式編程則完成一個功能,其他代碼用來調用即可,提供了代碼的重用性和代碼間的耦合。而對於一個複雜的功能來,可能需要多個函數才能完成(函數又可以在不同的.py文件中),n個 .py 文件組成的代碼集合就稱為模塊。 如:os 是 ...
  • pageContext對象: 1.可以作為入口對象獲取其他八大隱式對象的引用 1.1 getEXception獲取exception隱世對象 1.2 getPage獲取page對象 1.3 getRequest 獲取request對象 1.4 getResponse 獲取response對象 1.5 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...