zoukankan      html  css  js  c++  java
  • @修饰符

    def funA(a):
        print 'funA'
    
    def funB(b):
        print 'funB'
    
    @funA
    @funB
    def funC():
        print 'funC'
    
    result:
    
    >>> ================================ RESTART ================================
    >>>
    funB
    funA
    
    可以这样思考,return funA(funB(funC))
    实例:
    
    def now()
        print '2016-05-11'
    
    now()
    
    如果我想在now执行前执行另外一个方法,而不修改now方法呢?那么就用到了装饰器
    
    def log(func):
        # func 参数传递的值就是 now方法  
        def wrap(*args, **kw):
    
            # *args, **kw 方法接收任何形式的参数
    
            print '2016-05-10'
            return func(*args, **kw)  # 执行now方法
        return wrap
    
    
    @log
    def now():
        print '2016-05-11'
    
    
    now()  # 相当于执行 now = log(now),可以看到 func 就是 now的值,用装饰方法覆盖now
    
    问题来了,我想传递参数呢?
    
    def log(text):
        def decorator(func):
            def wrap(*args, **kw):
                print text
                return func(*args, **kw)
            return wrap
        return decorator
    
    
    @log('2016-05-10')
    def now():
        print '2016-05-11'
    
    
    now()  # 相当于执行 now = log('2016-05-10')(now)

    1.  @prototype修饰符的用法

    class Person(object):
    
        def __init__(self):
            
            self.__x = None
            
        def setx(self, value):
        
            self.__x = value
            
         def getx(self):
         
             return self.__x
             
         def delx(self):
         
             del self.__x
             
         x = property(getx, setx, delx)
    
    p = Person()
    
    p.x = 123  # 自动调用 setx 方法
    print p.x  # 自动调用 getx 方法
    
    del p.x    # 自动调用 delx 方法

    另外一种用法:

    class Person(object):
    
        def __init__(self):
            
            self.__x = None
            
        @prototype    
        def x(self):
            return self.__x
        
        @x.setter
        def x(self, value):
            self.__x = value
        
        @x.deleter
        def x(self):
            del self.__x
            
    p = Person()
    
    p.x = 123  # 自动调用 setx 方法
    print p.x  # 自动调用 getx 方法
    
    del p.x    # 自动调用 delx 方法

    2. staticmethod修饰符

    被staticmethod修饰符的表示这是一个类的静态方法,可以被类直接调用

    class Person(object):
        
        @staticmethod
        
        def hello():
            print 'hello world!!!'
    if __name__ == '__main__':
        Pserson.hello()
  • 相关阅读:
    Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析
    Linq分区操作之Skip,SkipWhile,Take,TakeWhile源码分析
    Linq生成操作之DefautIfEmpty,Empty,Range,Repeat源码分析
    Linq基础操作之Select,Where,OrderBy,ThenBy源码分析
    PAT 1152 Google Recruitment
    PAT 1092 To Buy or Not to Buy
    PAT 1081 Rational Sum
    PAT 1084 Broken Keyboard
    PAT 1077 Kuchiguse
    PAT 1073 Scientific Notation
  • 原文地址:https://www.cnblogs.com/ouyangping/p/8453003.html
Copyright © 2011-2022 走看看