Python中Class類用法執行個體分析

來源:互聯網
上載者:User
本文執行個體講述了Python中Class類用法。分享給大家供大家參考,具體如下:

儘管Python在Function Programming中有著其他語言難以企及的的優勢,但是我們也不要忘了Python也是一門OO語言哦。因此我們關注Python在FP上的優勢的同時,還得瞭解一下Python在OO方面的特性。

要討論Python的OO特性,瞭解Python中的Class自然是首當其衝了。在Python中定義class和建立對象執行個體都很簡單,具體代碼如下:

class GrandPa:  def __init__(self):    print('I\'m GrandPa')class Father(GrandPa):  def __init__(self):    print('I\'m Father!')class Son(Father):  """A simple example class"""  i = 12345  def __init__(self):    print('這是建構函式,son')  def sayHello(self):    return 'hello world'if __name__ == '__main__':  son = Son()  # 類型協助資訊   print('類型協助資訊: ',Son.__doc__)  #類型名稱  print('類型名稱:',Son.__name__)  #類型所繼承的基類  print('類型所繼承的基類:',Son.__bases__)  #類型字典  print('類型字典:',Son.__dict__)  #類型所在模組  print('類型所在模組:',Son.__module__)  #執行個體類型  print('執行個體類型:',Son().__class__)

運行效果如下:

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:03:43) [MSC v.1600 32 bit (Intel)] on win32Type "copyright", "credits" or "license()" for more information.>>> ================================ RESTART ================================>>> 這是建構函式,son類型協助資訊: A simple example class類型名稱: Son類型所繼承的基類: (,)類型字典: {'__module__': '__main__', 'sayHello': , '__doc__': 'A simple example class', '__init__': , 'i': 12345}類型所在模組: __main__這是建構函式,son執行個體類型: >>>

Python支援多重繼承

首先第一點,你會發現Class的定義中有一個括弧,這是體現繼承的地方。 Java用extends,C#、C++用冒號(:),Python則用括弧了。從括弧中包含著兩個值,聰明的你一定可以發現:Python支援多重繼承;

__init__是Class中的建構函式

第二點,__init__是Class中的建構函式,兩種不同形式的建構函式體現了Python支援函數重載。在建構函式中,有一個特別的參數self,其含義與我們在Java和C#中常見的this是一樣的。在這裡需要強調一點:在Class中定義的方法實質上也是function,但是在方法定義的時候必須包含self這個參數,而且必須將self這個參數放在第一位;

python成員變數

第三點,在Python中,你並不需要顯式的聲明Class的Data Members,而是在賦值的時候,被賦值的變數就相應成為了Class的Data Memebers,正如代碼中的x和y。不僅你不需要顯式的聲明Data Members,更加特別的,你甚至可以通過del方法將Class中的Data Memebers給刪掉。當我第一次看到這樣的特性的時候,著實吃了一驚。畢竟OO的第一條就是封裝了,但是這樣的特性是不是破壞了封裝的特性呢?

python方法二義性問題

第四點,由於Python支援多重繼承,因此就有可能出現方法二義性問題[1]。然而由於Python遵循深度優先的搜尋法則,很好地避免了方法二義性的問題。例如在以上的代碼中,MyClass同時繼承於BaseClassA和BaseClassB,假設MyClass調用一個叫derivedMethod方法,derivedMethod同時定義在BaseClassA和BaseClassB中,且Signature也完全相同,那麼BaseClassA中的方法將被調用。如果BaseClassA中並沒有定義derivedMethod,而是BaseClassA的父類定義了這個方法的話,將會是BaseClassA的父類中derivedMethod被調用。總之,繼承方法搜尋的路徑是先從左至右,在選定了一個BaseClass之後,將會一直沿著該BaseClass的繼承結構進行搜尋,直至最頂端,然後再到另外一個一個BaseClass。

就先說著這麼多了,對於Python中OO的特性將會在以後的Post中有進一步的講述。

方法二義性:由於一個類同時繼承於兩個或者多個父類,而在這些父類當中存在著signature完全相同的方法,那麼編譯器將無法判斷子類將繼承哪個父類中的方法,從而導致方法二義性問題。

希望本文所述對大家Python程式設計有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.