python @修饰符的几种用法

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()

3. 装饰器。

def log(text):
    def wrapper(*args, **kw):
        print '%s %s():' % (text, func.__name__)
        return func(*args, **kw)
    return wrapper


@log
def now():
    print '2013-12-25'


now()

#相当于执行 now = log(now)

由于log()是一个decorator,返回一个函数,所以,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数。

def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print '%s %s():' % (text, func.__name__)
            return func(*args, **kw)
        return wrapper
    return decorator


@log('execute')
def now():
    print '2013-12-25'


now()

#相当于执行了 now = log('execute')(now)

首先执行log('execute'),返回的是decorator函数,再调用返回的函数,参数是now函数,返回值最终是wrapper函数。

以上两种decorator的定义都没有问题,但还差最后一步。因为我们讲了函数也是对象,它有__name__等属性,但你去看经过decorator装饰之后的函数,它们的__name__已经从原来的'now'变成了'wrapper'.

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819879946007bbf6ad052463ab18034f0254bf355000#0

你可能感兴趣的:(python @修饰符的几种用法)