python內置裝飾器有屬性(property),類方法(classmethod),靜態方法(staticmethod)
屬性(property)
property可以將python定義的函數當做屬性訪問,從而提供更加友好訪問方式,但是有時候setter/deleter也是需要的
- 只有@property表示只讀。
- 同時有@property和@x.setter表示可讀可寫。
- 同時有@property和@x.setter和@x.deleter表示可讀可寫可刪除。
實例
class Foo:
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
if not isinstance(value, str):
raise TypeError('name must be str')
self.__name = value
@name.deleter
def name(self):
raise TypeError('can not delete')
f = Foo('jack')
print(f.name) # jack
f.name = 'hanmeimei'
print(f.name) # hanmeimei
# del f.name # TypeError: can not delete
類方法(classmethod)
僅僅與類交互而不和實例交互,類在使用時會將類本身當做參數傳給類方法的第一個參數
實例
class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
@classmethod
def now(cls):
t = time.localtime()
return cls(t.tm_year, t.tm_mon, t.tm_mday)
def __str__(self):
return '%s-%s-%s' % (self.year, self.month, self.day)
e = Date.now()
print(e) # 2018-8-1
靜態方法(staticmethod)
靜態方法和在普通的非class的method作用是一樣的,只不過是命名空間是在類裏面。
一般使用場景就是和類相關的操作,但是又不會依賴和改變類、實例的狀態,比如一些工具方法。
實例
class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
@staticmethod
def now():
t = time.localtime()
return Date(t.tm_year, t.tm_mon, t.tm_mday)
def __str__(self):
return '%s-%s-%s' % (self.year, self.month, self.day)
e = Date.now()
print(e) # 2018-8-1