zoukankan      html  css  js  c++  java
  • 飘逸的python

    @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__了.


  • 相关阅读:
    LVM逻辑卷管理器
    Linux LVM硬盘管理及LVM扩容
    Windows10 笔记本的电池坏了几秒钟就自动关机或休眠
    Cmder 下载地址和配置
    Linux 按 tab 补全忽略大小写
    Layui 官网下线, Layui文档镜像备份
    【markdown】markdown教程(1)
    【Ceph | OSD】删除OSD和Host的正确方法
    OSD
    【Leetocode | 001】146. LRU 缓存机制
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5103767.html
Copyright © 2011-2022 走看看