最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python之classmethod和staticmethod的区别

    正文概述    2020-06-23   272

    Python之classmethod和staticmethod的区别

    python中3种方式定义类方法,常规方式、@classmethod修饰方式、@staticmethod修饰方式。

    class A(object):
        def foo(self, x):
            print('调用foo函数 (%s, %s)'%(self, x))
            print('self:', self)
        @classmethod
        def class_foo(cls, x):
            print('调用class_foo函数 (%s, %s)' % (cls, x))
            print('cls:', cls)
        @staticmethod
        def static_foo(x):
            print('调用static_foo函数 (%s)' % (x))
    a = A()

    1. 定义方式

    普通foo()函数需要self参数隐式的传递当前类对象的实例。@classmethod修饰的方法class_foo()需要通过cls参数传递当前类对象。@staticmethod修饰的方法定义与普通函数是一样的。

    self和cls的区别不是强制的,只是PEP8中一种编程风格,slef通常用作实例方法的第一参数,cls通常用作类方法的第一参数。即通过self来传递当前类对象的实例,cls传递当前类对象。

    2. 绑定对象

    foo方法绑定对象A的实例
    print(a.foo)
    <bound method A.foo of <__main__.A object at 0x100721cf8>>
    class_foo方法绑定对象A
    print(a.class_foo)
    <bound method A.class_foo of <class '__main__.A'>>
    static_foo没有参数绑定。
    print(a.static_foo)
    <function A.static_foo at 0x100727730>

    相关推荐:《Python视频教程》

    3. 调用的方式

    foo可通过实例a调用,类对象A直接调用会参数错误。

    print(a.foo(1))
    调用foo函数 (<__main__.A object at 0x10245ccf8>, 1)
    self: <__main__.A object at 0x10245ccf8>
    print(A.foo(1))
    Traceback (most recent call last):
      File "/Users/liuhuiling/Desktop/MT_code/OPUnittest/case/demo.py", line 63, in <module>
        print(A.foo(1))
    TypeError: foo() missing 1 required positional argument: 'x'

    class_foo可通过类对象A 或对象实例a调用。

    a.class_foo(2)
    A.class_foo(2)
    调用class_foo函数 (<class '__main__.A'>, 2)
    cls: <class '__main__.A'>

    static_foo可通过类对象A 或对象实例a调用。

    a = A()
    a.static_foo(3)
    A.static_foo(3)
    调用static_foo函数 (3)

    4. 继承与覆盖普通类函数一样。

    class C(A):
        pass
    c = C()
    c.foo(1)
    c.class_foo(1)
    c.static_foo(1)

    运行结果:

    调用foo函数 (<__main__.B object at 0x10246a2b0>, 1)
    self: <__main__.B object at 0x10246a2b0>
    调用class_foo函数 (<class '__main__.B'>, 1)
    cls: <class '__main__.B'>
    调用static_foo函数 (1)

    下载网 » Python之classmethod和staticmethod的区别

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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