@songying
2018-07-27T21:59:16.000000Z
字数 1080
阅读 1071
python高级特性
https://blog.csdn.net/youngbit007/article/details/68957848
https://www.zhihu.com/question/20021164
staticmethod 表示静态方法, 可以通过对象和类对象实例访问。
当我们给方法加上@property
时,我们就可以把该方法当成一个属性来用, 此时会创建一个新的装饰器@funcname.setter
,它可以把被装饰的方法变成属性来赋值。如果没有实现@funcname.setter
时, 这个方法就只是一个只读属性,如果修改它,会引发AttributeError
。
class Exam(object):
def __init__(self, score):
self._score = score
@property
def score(self):
return self._score
@score.setter
def score(self, val):
if val < 0:
self._score = 0
elif val > 100:
self._score = 100
else:
self._score = val
这是一项优化技术,它把耗时的函数的结果保存起来,避免传入相同的参数时重复计算。
@functools.lru_cache()
注意: lru_cache可以使用两个可选的参数来配置。
functools.lru_cache(maxsize=128, typed=False)
- maxsize: 指定存储多少个调用的结果。缓存满了之后,旧的结果会被扔掉,腾出空
间。为了得到最佳性能,maxsize 应该设为 2 的幂。- typed 参数如果设为 True,把不同参数类型得到的结果分开保存,即把通常认为相等的浮点数和整数参数(如 1 和 1.0)区分开。
- 因为
lru_cache
使用字典存储结果,而且键根据调用时传入的定位参数和关键字参数创建,所以被lru_cache
装饰的函数,它的所有参数都必须是可散列的。
functools.singledispatch 装饰器可以把整体方案拆分成多个模块,甚至可以为你无法修改的类提供专门的函数。使用 @singledispatch 装饰的普通函数会变成泛函数(generic function):根据第一个参数的类型,以不同方式执行相同操作的一组函数。