Python的staticmethod和classmethod装饰器用法、区别

Python的staticmethod和classmethod装饰器会迷惑一些人,有的人总会纠结什么时候用怎么用。俺写了个简单的例子,很清楚就能看出来这几种方法的区别。什么时候用怎么用就不用再多说了吧。


# -*- coding:utf-8 -*-
class A(object):
    def foo(self,x):
        print "executing foo(%s,%s)"%(self,x)
 
    @classmethod
    def class_foo(cls,x):
        print "executing class_foo(%s,%s)"%(cls,x)
        cls().foo(x)
 
    @staticmethod
    def static_foo(x):
        print "executing static_foo(%s)"%x
a=A()
a.foo(1)
print '1'
a.class_foo(1)
print '2'
A.class_foo(1)
print '3'
a.static_foo(1)
 
'''
executing foo(<__main__.A object at 0x01AA17F0>,1)
1
executing class_foo(<class '__main__.A'>,1)
executing foo(<__main__.A object at 0x01AA1830>,1)
2
executing class_foo(<class '__main__.A'>,1)
executing foo(<__main__.A object at 0x01AA1830>,1)
3
executing static_foo(1)
'''
Via:Chairo@2012年03月04日-EOF-

python的functools.partial用法解释

在使用bottle的jinja2_template过程中碰到了一个自定义filter的问题,其中bottle关于jinja2_template的定义是这样的:

jinja2_template = functools.partial(template, template_adapter=Jinja2Template)

在.NET中class也是有partial这个概念的,所以从字面理解,jinja2_template应该是template和后边template_adapter=Jinja2Template这个参数之和的结果。官方的解释为:

Return a new partial object which when called will behave like func called with the positional arguments args and keyword arguments keywords.

官方给的例子:
from functools import partial
basetwo = partial(int, base=2)
basetwo.__doc__ = 'Convert base 2 string to an int.'
basetwo('10010')
18

不管你懂没懂,反正我是没懂。最后Google了下,在这里找到一个简单易懂的例子。摘录如下:

import functools
def add(a, b):
    return a + b
 
add(4, 2)
6
plus3 = functools.partial(add, 3)
plus5 = functools.partial(add, 5)
plus3(4)
7
plus3(7)
10
plus5(10)
15

函数的partial应用
典型的,函数在执行时,要带上所有必要的参数进行调用。然后,有时参数可以在函数被调用之前提前获知。这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用。

所以bottle中使用jinja2_template即等同于template(你传入参数, template_adapter=Jinja2Template)。稍后的文章会再说明如何自定义filters

Via:Chairo@2011年11月17日-EOF-