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

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