国产成人AV无码一二三区,少女1到100集,国产精品久久久久精品综合紧,巜公妇之诱感肉欲HD在线播放

文章 > Python基础教程 > python 成员方法的区别是什么

python 成员方法的区别是什么

Python 成员方法 区别

头像

爱喝马黛茶的安东尼

2019-09-17 17:24:372955浏览 · 0收藏 · 0评论

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

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++不同,实例是可以动态添加属性的,即实例的属性和类的属性不一定一样。

关注

关注公众号,随时随地在线学习

本教程部分素材来源于网络,版权问题联系站长!

女性私密紧致情趣玩具| A级艳片《武则天》| 快乐公媳1-36集全免费看| 禁忌3| 高三妈妈用性缓解孩子压力| 小雪奶水涨公帮忙吸| 咬女生小头头视频| 免费B站看大片真人电视剧| 辣妹保镖| 《魅魔妈妈》第1季动漫| 成色18K1.220.38软件| 《高压监狱5》完整版| 女人尝试到更粗大的心理变化 | 大肉蟒撑开稚嫩紧窄| 国精产品-区-区二区MBA| 一母四女共一婿的全诗解读 | 憋尿白丝小肚子凸起高冷知乎| 床戏| 日日AV夜夜添久久奶无码| 乳首やばっちやんねん的英文| 《酒店激战》动漫1-5集免费观..| 《请好好疼爱里面》免费观看| 妈妈洗澡不把门关紧暗示什么 | 《日本公与媳5》公妇伦| 星空麻花MV高清| 妈妈总是晚上装睡配合孩子| 女子赤身跳钢管舞视频| 成品网站1688在线应用评价| 魂断威尼斯豆瓣| 乳腺增生| 老师办公室狂肉校花小说| 母与子免费观看大全电视剧邻居大.. | 儿媳妇长太漂亮免费观看电视剧| 克什米尔| 添女人荫蒂全部过程AV视频| 法国伦理巜公共汽车| 国精-二二产品无人区| 美国灭火宝贝3| 按摩店的待遇5HD| 小辣椒3美国伦理| 女学生被老师骗到家中