python 成员方法的区别是什么

Python的静态方法和类成员方法可以通过类或实例进行访问,两者的概念不易理清,但仍存在差异:
1)静态方法不需要引入self参数,类成员方法需要引入代表此类的cls参数;
2)从第一条开始,静态方法不能访问实例变量,类成员方法也不能访问实例变量,但可以访问类变量;
3)静态方法有点像函数工具库,而类似的成员方法更接近Java面向对象概念中的静态方法。
实现静态法和类法的两种方法
一、Python 2.3及以前,用staticmethod和classmethod类型对象包装
例子如下(注意print中的说明):
classMyClass: val1='Value1' def__init__(self): self.val2='Value2' defstaticmd(): print'无法访问val1和val2'的静态方法; smd=staticmethod(staticmd) defclassmd(cls): print'类方法:'+str(cls)+',val1:'+cls.val1+',无法访问val2值' cmd=classmethod(classmd)
执行:
>>>mc=MyClass() >>>mc.smd() >>>mc.cmd() >>>MyClass.smd() >>>MyClass.cmd()
相关推荐:Python教程
二、Python 2.4及之后,使用装饰器(decorators)实现
使用@操作符进行装饰,如下:
classMyClass: val1='Value1' def__init__(self): self.val2='Value2' @staticmethod defstaticmd(): print'无法访问val1和val2'的静态方法; @classmethod defclassmd(cls): print'类方法:'+str(cls)+',val1:'+cls.val1+',无法访问val2值'
无论以上两种方式中哪一种,执行情况都是一样的,以方式二执行结果为例,分析如下:
执行:
>>>mc=MyClass()#实例化 >>>mc.staticmd()#实例调用静态方法,无法访问实例变量val1和val2 >>>
无法访问val1和val2的静态方法
>>>mc.classmd()#实例调用方法,请注意,这里访问的是Myclass的变量val1值,而不是实例化后mc的实例变量val1, 这里很容易混淆,往下看就会明白。val2一直是实例变量,无法访问 >>>
类方法,类:___main__.MyClass,val1:Value 1.val2的值无法访问
>>>MyClass.staticmd()#类直接调用静态方法,结果与上述实例调用,类变量和实例变量无法访问 >>>
无法访问val1和val2的静态方法
>>>MyClass.classmd()#类直接调用类方法,结果与上述实例调用 >>>
类方法,类:___main__.MyClass,val1:Value 1.val2的值无法访问
>>>mc.val1='Valuechanged'#改变实例变量val1的值 >>>mc.classmd()#实例调用方法,注意cls.val1的值没有变化,所以此时的cls.val1是类变量val1,而不是实例变量val1 >>>
类方法,类:___main__.MyClass,val1:Value 1.val2的值无法访问
>>>MyClass.classmd()#类直接调用类方法,结果与上述实例调用 >>>
类方法,类:___main__.MyClass,val1:Value 1.val2的值无法访问
>>>MyClass.val1='ClassValuechanged'#类变量val1值的变化 >>>mc.classmd()#实例调用方法,注意cls.val1的值发生了变化,因此进一步证明了此时的cls.val1是类变量val1, 而非实例变量val1 >>>
类方法,类:___main__.MyClass,val1:Class Value changed,val2的值无法访问
>>>MyClass.classmd()#类直接调用类方法,结果与上述实例调用 >>>
类方法,类:___main__.MyClass,val1:Class Value changed,val2的值无法访问
结论
若上述执行过程过于复杂,请记住以下两点:
1. 静态成员方法:不能访问类属性,实例属性,相当于一种独立的方法,可以理解与类无关,只是添加了一个功能域,如:类,有三种加密算法,可以考虑静态方法;
2. 类成员方法:可以访问类属性,但不能访问实例属性。这里需要注意的是,python是一种动态语言。与c++不同,实例可以动态添加属性,即实例属性和类属性不一定相同。
