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()
  • 相关阅读:
    显卡关键词
    为照顾IE6尽量不要margin和padding
    如何保证一个类只有一个实例(1)
    显示列表(display list)
    AutoCAD2007与Office2007冲突
    虚函数(1)
    字符串对象的属性
    细读cow.osg
    常量折叠(const folding)与复写传播 (copy propagation)
    .NET Framework 3.5 sp1离线安装
  • 原文地址:https://www.cnblogs.com/ouyangping/p/8453003.html
Copyright © 2011-2022 走看看