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


  • 相关阅读:
    docker删除容器再删除镜像
    centOS7安装docker遇到 [Errno 14] curl#35
    设置centos7界面语言为中文
    sublime查看项目代码多少行
    1. 常用及特殊
    7.逆波兰,二叉树三叉树
    6.表单提交,input键盘变搜索,有关自定义属性input操作
    5.字符串的第一次见到的方法
    2.手机上浏览器看控制台的插件
    1. 时间插件
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5103767.html
Copyright © 2011-2022 走看看