最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • python 成员方法的区别是什么

    正文概述    2020-04-10   203

    python 成员方法的区别是什么

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


    起源地下载网 » python 成员方法的区别是什么

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元