Python的类方法和静态方法

类方法和静态方法

  • @staticmethod 表示下面 方法是静态方法
  • @classmethod 表示下面的方法是类方法

例子

>>> class StaticMethod(object):
...     @staticmethod
...     def foo():
...         print "this is static method foo()"
...

>>> class ClassMethod:
...     @classmethod
...     def bar(cls):
...         print "this is class method bar()"
...         print "bar() is part of class:",cls.__name__
... 

>>> static_foo = StaticMethod()
>>> static_foo.foo()
this is static method foo()
>>> StaticMethod.foo()
this is static method foo()
>>> 

>>> class_bar = ClassMethod()
>>> class_bar.bar()
this is class method bar()
bar() is part of class: ClassMethod
>>> ClassMethod.bar()
this is class method bar()

从以上例子,可以看出:

  • 无论是类方法、静态方法,方法后面的括号内;
  • 都可以不用加self作为第一个参数,都可以使用实例调用方法或者类名调用方法。
  • 在类方法的参数中,需要使用cls作为参数。
  • 在静态方法的参数中,没有self参数,就无法访问实例变量,类和实例的属性了。

类方法和静态方法的区别

>>> class Kls(object):
...     def __init__(self,data):
...         self.data = data
...     def printd(self):
...         print(self.data)
...     @staticmethod
...     def smethod(*arg):
...         print 'Static:',arg
...     @classmethod
...     def cmethod(*arg):
...         print 'Class:',arg
... 
>>> ik = Kls(24)
>>> ik.printd()
24

>>> ik.smethod()
'Static:', ()

>>> ik.cmethod()
'Class:', (,)

>>> Kls.printd()
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unbound method printd() must be called with Kls instance as first argument (got nothing instead)

>>> Kls.smethod()
'Static:', ()

>>> Kls.cmethod()
'Class:', (,)

从以上例子可以看出,类方法默认的第一个参数是他所属的类的对象,而静态方法没有。

你可能感兴趣的:(Python的类方法和静态方法)