您的位置:首页 > 编程语言 > Python开发

飘逸的python - property及实现lazy property

2016-01-05 20:59 766 查看
@property有什么用呢?表面看来,就是将一个方法用属性的方式来訪问.

上代码,代码最清晰了.

class Circle(object):
def __init__(self, radius):
self.radius = radius

@property
def area(self):
return 3.14 * self.radius ** 2

c = Circle(4)
print c.radius
print c.area


能够看到,area尽管是定义成一个方法的形式,可是加上@property后,能够直接c.area,当成属性訪问.

如今问题来了,(不是挖掘机技术哪家强),每次调用c.area,都会计算一次,太浪费cpu了,如何才干仅仅计算一次呢?这就是lazy property.

class lazy(object):
def __init__(self, func):
self.func = func

def __get__(self, instance, cls):
val = self.func(instance)
setattr(instance, self.func.__name__, val)
return val

class Circle(object):
def __init__(self, radius):
self.radius = radius

@lazy
def area(self):
print 'evalute'
return 3.14 * self.radius ** 2

c = Circle(4)
print c.radius
print c.area
print c.area
print c.area
能够看到,'evalute'仅仅输出了一次.假设看了我前面几篇博文,对@lazy的机制应该非常好理解.

在这里,lazy类有__get__方法,说明是个描写叙述器,第一次运行c.area的时候,由于顺序问题,先去c.__dict__中找,没找到,就去类空间找,在类Circle中,有area()方法,于是就被__get__拦截.

在__get__中,调用实例的area()方法算出结果,并动态给实例加入个同名属性把结果赋给它,即加到c.__dict__中去.

再次运行c.area的时候,先去c.__dict__找,由于此时已经有了,就不会经过area()方法和__get__了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: