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


  • 相关阅读:
    DB2 for Z/os Statement prepare
    Foreign key (referential) constraints on DB2 LUW v105
    复制Informational constraints on LUW DB2 v105
    DB2 SQL Mixed data in character strings
    DB2 create partitioned table
    MVC中使用EF的技巧集(一)
    Asp.Net MVC 开发技巧(二)
    Linq使用技巧及查询示例(一)
    Asp.Net MVC 开发技巧(一)
    Asp.Net MVC Identity 2.2.1 使用技巧(八)
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5103767.html
Copyright © 2011-2022 走看看