python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:
成都创新互联是一家专注于成都做网站、网站制作与策划设计,岳阳楼网站建设哪家好?成都创新互联做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:岳阳楼等地区。岳阳楼做网站价格咨询:028-86922220
1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;
2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量;
3)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法。
实现静态方法和类方法的两种方式
一、在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
>>> 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 = '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的值
>>> MyClass.val1 = 'Class Value changed' # 改变类变量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++不同,实例是可以动态添加属性的,即实例的属性和类的属性不一定一样。
分享标题:创新互联Python教程:python成员方法的区别是什么
网站网址:http://www.shufengxianlan.com/qtweb/news40/8790.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联