现在的位置: 首页 > 综合 > 正文

Python的静态方法和类方法

2014年05月14日 ⁄ 综合 ⁄ 共 1236字 ⁄ 字号 评论关闭
可以直接被类或者类的实例调用。
1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;
2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量;
3)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法。
class MyClass:
    val1 = 'apple'
    def __init__(self):
        val2 = 'banana'     
    @staticmethod
    def staticmd():
        print val1+":"+val2     
    @classmethod
    def classmd1(cls):
        print cls.val2
    @classmethod
    def classmd2(cls):
        print cls.val1
>>> MyClass.staticmd()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-325-e7a1dcd0e04d> in <module>()
----> 1 MyClass.staticmd()

<ipython-input-323-d82dece8064f> in staticmd()
      5     @staticmethod
      6     def staticmd():
----> 7         print val1+":"+val2
      8     @classmethod
      9     def classmd(cls):

NameError: global name 'val1' is not defined

>>> MyClass.classmd1()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-327-c83635b87838> in <module>()
----> 1 MyClass.classmd1()

<ipython-input-326-48fb9fb0f284> in classmd1(cls)
      8     @classmethod
      9     def classmd1(cls):
---> 10         print cls.val2
     11     @classmethod
     12     def classmd2(cls):

AttributeError: class MyClass has no attribute 'val2'

>>> MyClass.classmd2()
apple
静态方法:无法访问类属性、实例属性,相当于一个相对独立的方法,跟类其实没什么关系,换个角度来讲,其实就是放在一个类的作用域里的函数而已。
类成员方法:可以访问类属性,无法访问实例属性。上述的变量val1,在类里是类变量,在实例中又是实例变量,所以容易混淆。

抱歉!评论已关闭.