Python的静态方法和类成员方法

高洛峰
发布: 2016-11-23 13:49:12
原创
1425人浏览过

python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:

1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;(参数cls代表本类)

2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量;

3)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法。

 

立即学习Python免费学习笔记(深入)”;

eMart 网店系统
eMart 网店系统

功能列表:底层程序与前台页面分离的效果,对页面的修改无需改动任何程序代码。完善的标签系统,支持自定义标签,公用标签,快捷标签,动态标签,静态标签等等,支持标签内的vbs语法,原则上运用这些标签可以制作出任何想要的页面效果。兼容原来的栏目系统,可以很方便的插入一个栏目或者一个栏目组到页面的任何位置。底层模版解析程序具有非常高的效率,稳定性和容错性,即使模版中有错误的标签也不会影响页面的显示。所有的标

eMart 网店系统 0
查看详情 eMart 网店系统

实现静态方法和类方法的两种方式

一、在Python 2.3及之前,用staticmethod和classmethod类型对象包装实现

例子如下(注意print里的说明):

class MyClass:
    val1 = 'Value 1'
    def __init__(self):
        self.val2 = 'Value 2'
    def staticmd():
        print '静态方法,无法访问val1和val2'
    smd = staticmethod(staticmd)

    def classmd(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)实现

装饰器使用@操作符,例子如下:

class MyClass:
    val1 = 'Value 1'
    def __init__(self):
        self.val2 = 'Value 2'

    @staticmethod
    def staticmd():
        print '静态方法,无法访问val1和val2'

    @classmethod
    def classmd(cls):
        print '类方法,类:' + str(cls) + ',val1:' + cls.val1 + ',无法访问val2的值'
 

不管是以上两种方式中的哪一种,执行情况都是一样的,以方式二执行结果为例分析如下:

执行:

>>> mc = MyClass()  # 实例化


>>> mc.staticmd()  # 实例调用静态方法,无法访问实例变量val1和val2

>>> 
静态方法,无法访问val1和val2

 

立即学习Python免费学习笔记(深入)”;

>>> mc.classmd()  # 实例调用类方法,注意,这里访问的是类MyClass的变量val1的值,不是实例化后mc的实例变量val1,这里容易混淆,往下看就会明白。val2一直是实例变量,所以无法访问

>>> 

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值
 

>>> MyClass.staticmd()  # 类直接调用静态方法,结果同上面的实例调用,无论是类变量还是实例变量都无法访问

>>> 
静态方法,无法访问val1和val2

 

立即学习Python免费学习笔记(深入)”;

>>> MyClass.classmd()  # 类直接调用类方法,结果同上面的实例调用

>>> 

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值

 

立即学习Python免费学习笔记(深入)”;

>>> mc.val1 = 'Value changed'  # 改变实例变量val1的值
 

>>> mc.classmd()  # 实例调用类方法,注意到cls.val1的值没变,所以,这时的cls.val1是类变量val1,而非实例变量val1

>>> 

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值


>>> MyClass.classmd()  # 类直接调用类方法,结果同上面的实例调用

>>> 

类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值

 

立即学习Python免费学习笔记(深入)”;

>>> MyClass.val1 = 'Class Value changed'  # 改变类变量val1的值


>>> mc.classmd()  # 实例调用类方法,注意到cls.val1的值变了,所以,进一步证明了这时的cls.val1是类变量val1,而非实例变量val1

>>> 

类方法,类:__main__.MyClass,val1:Class Value changed,无法访问val2的值

 

立即学习Python免费学习笔记(深入)”;

>>> MyClass.classmd()  # 类直接调用类方法,结果同上面的实例调用

>>> 

类方法,类:__main__.MyClass,val1:Class Value changed,无法访问val2的值

 

立即学习Python免费学习笔记(深入)”;

结论

如果上述执行过程太复杂,记住以下两点就好了:

静态方法:无法访问类属性、实例属性,相当于一个相对独立的方法,跟类其实没什么关系,换个角度来讲,其实就是放在一个类的作用域里的函数而已。

类成员方法:可以访问类属性,无法访问实例属性。上述的变量val1,在类里是类变量,在实例中又是实例变量,所以容易混淆。

相关标签:
python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号