shevonWang's Blog

Python静态方法、类成员方法和装饰器

静态方法的定义没有 self 参数,且能够被类本身直接调用。类方法在定义时需要名为 cls 的类似于 self 的参数,类成员方法可以直接用类的具体对象调用。

selfcls 只是python中约定的写法,本质上只是一个函数参数而已,没有特别含义。任何对象调用方法都会把自己作为该方法中的第一个参数,传递到函数中。python中万物都是对象,下面代码里的 cls 就是 cmeth 的第一个参数。

注: staticmethodclassmethod 分别返回静态方法和类成员方法。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

__metaclass__ = type

class Myclass:
    @staticmethod
    def smeth():
           print "This is a static method."
    # smeth = staticmethod(smeth)

    @classmethod
    def cmeth(cls):
        print "This is a class method of", cls
    # cmeth = classmethod(cmeth)

if __name__ == "__main__":
    Myclass.smeth()
    Myclass.cmeth()

注: Myclass.smeth() 里的 smeth() 指的是被注释代码 = 左边的 smethMyclass.cmeth() 同理。

运行结果:

This is a static method.
This is a class method of <class '__main__.Myclass'>

上面代码使用了 @ 操作符,也就是装饰器语法。它能对任何可调用的对象进行包装,既能用于方法也能用于函数。
多个装饰器在应用时的顺序与指定顺序相反。
eg:

@a
@b
@c
def f ():

等效于

f = a(b(c(f)))

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下,增加函数的额外功能。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的将,装饰器的作用就是为已经存在的对象添加额外的功能。

由于不确定被装饰函数的参数,所以可以用 *args**kwargs 表示任意参数。

def decoractor(func):
    def wrapper(*args, **kwargs):
        print "Start running the %s ..." % func.__name__
        func(*args, **kwargs)
        print "End running the %s ..." % func.__name__
    return wrapper

# @decoractor 等同于 func = decoractor(func)
@decoractor
def func():
    print "I`m func..."

if __name__ == "__main__":
    func()

上面代码的功能是利用装饰器,为 func 函数增添两次打印功能。
运行结果:

Start running the func ...
I`m func...
End running the func ...