用class定義類--Python


Python使用class創建對象。沒個定義的類都有一個特殊的方法,名為__init__(),可以通過這個方法控制如何初始化對象。

定義類的基本形式:

class Athlete:
    def __init__(self):
        #The code to initialize a "Athlete" object.
            ......

創建對象實例:有了類之后,創建對象實例很容易。只需將對類名的調用賦至各個變量。通過

這種方式,類(以及__init__()方法)提供了一種機制,允許你創建一個定制的工廠函數,

用來根據需要創建多個對象實例。與C++系列語言不同,Python中沒有定義構造函數“new”

的概念。Python會為你完成對象構建,然后可以使用__init__()方法定制對象的初始狀態。

self的重要性

定義一個類時,實際上是在定義一個定制工廠函數,然后可以在你的代碼中使用這個工廠函數

創建實例,即:

a = Athlete()
Athlete().__init__(a)
____________________________________________________
Athlete為類名,__init__為方法名,a為對象實例的目標標識符。

在類中定義__init__()方法:

def __init__(self):
    # The code to initialize an "Athlete" object.
       ......

每個方法的第一個參數都是self

實際上,不僅__init__()方法需要self作為它的第一個參數,類中定義的所有其他方法也是如此。

Python要求每個方法的第一個參數為調用對象實例。下面擴展這個實例類,在一個名為thing的對象

屬性中存儲一個值,具體值在初始化時設置。另外還要擴充一個方法,名為how_big(),它會利用len()

BIF返回thing的長度:

class Athlete:
    def __init__(self, value=0):
        self.thing = value
    def how_big(self):
        return(len(self.thing))
---------------------------------------------------------------
現在“初始化”代碼將所提供的一個值賦至一個名為“self.thing”的
類屬性。
how_big() 方法返回“self.thing”的長度。

在一個對象實例上調用類方法時,Python要求第一個參數是調用對象實例,這往往賦至各個方法的self參數。

只憑這一點就足以解釋為什么self如此重要,也可以由此說明編寫對象方法時為什么所有對象方法的第一個參

數必須是self。

 繼承Python內置的list

Python的class允許你從零開始創建一個定制類,就像創建Athlete類那樣。不過,class還允許通過繼承現有的

其他類來創建一個類,這也包括list,set和dict提供的Python內置數據結構類。通過繼承創建的這些類稱為子類。

class NameList(list):
    def __init__(self, a_name):
        list.__init__([])
        self.name = a_name
定義了NameList類之后,用它創建一個對象實例,檢查對象類型(使用type()BIF),看看它會提供什么內容(使用dir()BIF):
johnny = NameList("John Paul Jones")
>>> type(johnny)
<class '__main__.NameList'>
>>> dir(johnny)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'name', 'pop', 'remove', 'reverse', 'sort']
使用list類提供的一些功能來補充Johnny中儲存的數據:
>>> johnny.append("Bass Player")
>>> johnny.extend(["Composer", "Arranger", "Musician"])
>>> johnny
['Bass Player', 'Composer', 'Arranger', 'Musician']
johnny.name
'John Paul Jones'
>>> vera.name
'Vera vi'
由於Johnny是一個列表,所以完全可以對它做列表處理:
>>> for attr in johnny:
    print(johnny.name + " is a " + attr + ".")

    
John Paul Jones is a Bass Player.
John Paul Jones is a Composer.
John Paul Jones is a Arranger.
John Paul Jones is a Musician.

 


免責聲明!

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



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