python的静态方法和类方法

静态方法和类方法不同于一般的实例方法的地方在于,他们的第一个参数不是self(self本身就代表实例的意思,他们不是实例方法,所以不需要把self传进去作为第一个参数),这两个方法都既可以被类本身调用,也可以被类的实例调用

static method

静态方法就是单纯的方法,它们是类定义的一部分。不需要实例作为它们的第一个参数。

		
class TestStaticMethod:
     def foo():                      #无参数,无self
         print 'calling static method foo()'
     foo = staticmethod(foo)

#使用@staticmethod写法
lass TestStaticMethod:
     @staticmethod
     def foo():                      #无参数,无self
         print 'calling static method foo()'


>>>tsm = TestStaticMethod()
>>>TestStaticMethod.foo()             #被类本身调用
calling static method foo()
>>>tsm.foo()                          #被类的实例调用
calling static method foo()
		
		

class method

普通方法需要一个实例作为第一个参数,并且随着方法的被调用(invocation),self会被自动传递给方法。对于类方法,类是需要作为第一个参数,并且被编译器自动传入方法。类不必特意被命名为像self这样的名字,但大多数人使用cls作为变量名。

		
class TestClassMethod:
     def foo(cls):                #参数cls
         print 'calling class method foo()'
         print 'foo() is part of class:',cls.__name__
     foo = classmethod(foo)
  

#使用@classmethod写法
class TestClassMethod:
     @classmethod
     def foo(cls):                #参数cls
         print 'calling class method foo()'
         print 'foo() is part of class:',cls.__name__
   

>>>tcm = TestClassMethod()
>>>TestClassMethod.foo()                    #被类本身调用
calling class method foo()
foo() is part of class:TestClassMethod
>>>tcm.foo()                                #被类的实例调用                               
calling class method foo()
foo() is part of class :TestClassMethod     #这里被类的实例调用仍然返回基类本身名字
		
		

主要内容出自《python核心编程 第二版》