python內置裝飾器

python內置裝飾器有屬性(property),類方法(classmethod),靜態方法(staticmethod)

 

屬性(property)

property可以將python定義的函數當做屬性訪問,從而提供更加友好訪問方式,但是有時候setter/deleter也是需要的

  1. 只有@property表示只讀。
  2. 同時有@property和@x.setter表示可讀可寫。
  3. 同時有@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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章