staticmethod 和 classmethod

2017-08-22  本文已影响146人  037251a7c483

Python 类有3种方法,分别是实例方法、类方法、静态方法。

简单来讲,实例方法的第一个参数为self,即实例本身; 类方法的第一个参数为cls,即类本身; 静态方法不需要参数,就和普通方法一样的。 实例可以调用这三种方法,但是类只能调用类方法和静态方法。

#!/usr/bin/env python
# coding: utf-8

class Method(object):
    value = 999

    def __init__(self, data):
        self.data = data

    def instance_method(self):
        print self.data

    @staticmethod
    def static_method():
        print "This is static method."

    @classmethod
    def class_method(cls):
        print cls.value
In [14]: method = Method(2)

In [15]: method.instance_method()
2

In [16]: method.static_method()
This is static method.

In [17]: method.class_method()
999

In [18]: Method.instance_method()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-18-41e7d5a9acb2> in <module>()
----> 1 Method.instance_method()

TypeError: unbound method instance_method() must be called with Method instance as first argument (got nothing instead)

In [19]: Method.static_method()
This is static method.

In [20]: Method.class_method()
999

实例二(使用上的区别)

示例

In [63]: class MyClass(object):
    ...:     value = 12
    ...:     def act(self):
    ...:         print 'This is a test.'
    ...:     @staticmethod
    ...:     def smeth():
    ...:         print 'This is a static method.'
    ...:         print MyClass.value
    ...:         print MyClass.act
    ...:         
    ...:     @classmethod
    ...:     def cmeth(cls):
    ...:         print 'This is a class method of ', cls
    ...:         print cls.value
    ...:         print cls.act
    ...:         
    ...:         

In [64]: MyClass.smeth()
This is a static method.
12
<unbound method MyClass.act>

In [65]: MyClass.cmeth()
This is a class method of  <class '__main__.MyClass'>
12
<unbound method MyClass.act>

In [66]: my = MyClass()

In [67]: my.cmeth()
This is a class method of  <class '__main__.MyClass'>
12
<unbound method MyClass.act>

In [68]: my.smeth()
This is a static method.
12
<unbound method MyClass.act>

上一篇下一篇

猜你喜欢

热点阅读