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