已經兩天沒更新了,這兩天比較心煩氣燥,什麼都看不下去,學不下去,大概是「大姨父」來了
自定義類有兩種語法格式:
class classname:
suit
這種語法格式不指定基類,在python中,不指定基類的話,預設的基類就是object。所以在python中,所有的類都是object的子類。如果要指定基類就要用另一種語法格式:
class classname(base_classes):
suit
其中的base_classes就是新建立的類的基類。在suit中就可以定義新類的方法了,用def來建立,就像建立乙個全域性函式那樣。
在定義函式的過程中,可以使用乙個隱含的引數self用來指代自己,就像c++中的this,只是在使用self的時候必須顯式的使用,不能像this那樣省略掉。
在python中,建立物件分兩個步驟,首先是建立乙個原始物件,會呼叫__new__(),然後初始化物件,會呼叫__init()。在自定義類的時候,一般__new__()都不需要重新寫,而__init__()幾乎都要重寫。
像這種在函式名開始和結尾處都有兩個下劃線的方法是特殊方法,自己定義的一般方法不應該以這樣的方式命名,以防跟以後公升級版本的特殊方法衝突。在子類的方法中如果想要呼叫基類的方法,可以使用super()來指定基類,然後用點操作符來呼叫基類的方法。
特性
如果想要對自定義類中的屬性進行控制,可以使用特性來實現。
像圓類中的求面積函式,求周長函式等其實都可以看作是類的乙個成員變數來取用,只是唯讀的,這樣的成員函式完全可以用特性來描述。這樣在需要這個值的時候,直接用特性而不需要呼叫方法就可以了。特性和方法的最顯著的區別就是修飾器。修飾器是乙個函式,該函式以乙個函式或方法為引數,並返回引數修飾後的版本。修飾器是通過在名字前使用@符號來標記的。比如property修飾器函式,這個修飾器函式是乙個內建函式,至多可以接受4個引數:乙個獲取者函式,乙個設定者函式,乙個刪除者函式以及乙個docstring。使用@property的效果與僅使用乙個引數(獲取者函式)呼叫property的效果是一樣的,例如:
def area(self):
return math.pi*(self.redius**2)
area = property(area)
更常用的是以下這種方式:
@property
def area(sef):
return math.pi*(self.redius**2)
另外,很重要的乙個,就如一開始所說的,可以把屬性轉換成特性來對其進行控制,這樣,我們必須建立乙個私有的屬性,其中實際存放了資料,並提供獲取者方法與設定者方法。私有的屬性用前面以兩個下劃線開始,如:__radius等,然後定義其各種方法:
@property
def radius(self):
"""注釋注釋
注釋注釋
return self.__redius
@redius.setter
def radius(self, radius):
assert radius > 0, "radius must be......"
self.__radius = radius
這兩個方法是獲取者方法和設定者方法,其他的兩個發展由python來設定。
python自定義類
設計乙個person類的3種方式 1 使用內建型別list person mike 23,male 0 姓名,1 年紀,2 性別 print person 0 person 1 person 2 2 使用字典型別dic person1 person2 print person1 name perso...
Python自定義佇列類
佇列 queue 是先進先出 fifo,first in first out 的線性表。在具體應用中通常用鍊錶或者陣列來實現。佇列只允許在後端 稱為rear 進行插入操作,在前端 稱為front 進行刪除操作。佇列的操作方式和堆疊類似,唯一的區別在於佇列只允許新資料在後端進行新增。queue是pyt...
Python學習 異常處理,自定義異常類
usr bin python coding utf 8 filename usingexception.py 異常處理 寫乙個自己定義的異常類 class myinputexception exception def init self,length,least exception.init sel...