Python2.7 學習體會 @classmethod @staticmethod @property 之間的關系二
先到百度找了一下資料,引用個重點,對比昨天實例來理解:
引用:http://blog.csdn.net/carolzhang8406/article/details/6856817
在Python中,靜態方法和類方法都是可以通過類對象和類對象實例訪問。但是區別是:
- @classmethod 是一個函數修飾符,它表示接下來的是一個類方法,而對於平常我們見到的則叫做實例方法。 類方法的第一個參數cls,而實例方法的第一個參數是self,表示該類的一個實例。
- 普通對象方法至少需要一個self參數,代表類對象實例
- 類方法有類變量cls傳入,從而可以用cls做一些相關的處理。並且有子類繼承時,調用該類方法時,傳入的類變量cls是子類,而非父類
- 靜態方法則沒有,它基本上跟一個全局函數相同,一般來說用的很少
引用:http://www.cnblogs.com/agnewee/p/5653936.html
@classmethod 優勢特點:
- 在一個地方解析日期字符串並且重復使用它。
- 做到很好的封裝(相對於把執行字符串解析作為一個單獨的函數在任何地方執行,這裏使用的方法更符合
OOP
的範式) cls
表示類對象,而不是類實例。這樣很酷,因為如果我們繼承Date
類,那麽所有的子類也都將擁有from_string
- 類方法通過隱性參數綁定在類上,函數內可通過隱性參數進行實例生成。
- calssmethod 方法,可以通過類和實例直接調用
---------------------------------------------------------------------------------------------------
@staticmethod 特點:
那麽staticmethod又是什麽呢?它和classmethod非常的相似,但是不強制要求傳遞參數(但是做的事與類方法或實例方法一樣)。
讓我們來看一個使用的例子。
我們有一個日期字符串需要以某種方式驗證。這個任務與之前一樣要定義在Date
類內部,但是不要求實例化它。
靜態方法在這種情況下就非常有用。看一下下面這個代碼片段:
@staticmethod
def is_date_valid(date_as_string):
day, month, year = map(int, date_as_string_split(‘-‘))
return day <= 31 and month <= 12 and year <= 3999
is_date = Date.is_date_valid(‘11-09-2012‘)
現在正如我們了解到的staticmethod
的使用,我們不需要訪問它所屬的類,它本質上就是一個函數,調用方式和調用函數一樣.靜態方法無綁定,和普通函數使用方法一樣,只是需要通過類或者實例來調用。沒有隱性參數。
---------------------------------------------------------------------------------------------------------
@porperty 特點:
只讀方法,實例調用不能輸入參數。
引用:http://blog.csdn.net/my2010sam/article/details/8585336
@property 就是給函數設置只讀屬性。
這裏定義的屬性是一個只讀屬性,如果需要可寫,則需要再定義一個setter:
class Rabbit(object):
def __init__(self,name):
self._name = name
@classmethod
def newClass(cls):
return ‘abc‘,cls,Rabbit(‘‘)
@property
def name(self):
return self._name
@name.setter
def name(self,newname):
self._name= newname
-----------------------------------------------------------------------------------------
實例方法通過隱性參數綁定在類上,函數內通過隱性參數訪問實例屬性。
Python2.7 學習體會 @classmethod @staticmethod @property 之間的關系二