zoukankan      html  css  js  c++  java
  • 基于python中staticmethod和classmethod的区别(详解)

    例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class A(object):
      def foo(self,x):
        print "executing foo(%s,%s)"%(self,x)
     
      @classmethod
      def class_foo(cls,x):
        print "executing class_foo(%s,%s)"%(cls,x)
     
      @staticmethod
      def static_foo(x):
        print "executing static_foo(%s)"%x 
     
    a=A()

    上述类有三个函数,使用如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    a.foo(1)
    # executing foo(<__main__.A object at 0xb7dbef0c>,1)
     
    -----------------------------------------------------------------
     
    a.class_foo(1)
    # executing class_foo(<class '__main__.A'>,1)
     
    A.class_foo(1)
    # executing class_foo(<class '__main__.A'>,1)
     
    -----------------------------------------------------------------
     
    a.static_foo(1)
    # executing static_foo(1)
     
    A.static_foo('hi')
    # executing static_foo(hi)

    区别

    • foo()的调用者必须是类A的一个实例,class_foo()与static_foo()的调用者既可以是类也可以是某个实例

    • 参数不同,foo() 参数为self和其他参数,class_foo()参数使用类(cls)替换了self,static_foo()则只有参数,没有self和类(cls)

    • a.foo(1)中的foo()与a是绑定的,class_foo()是与类绑定的,而static_foo()与这两者都没有绑定,可以使用print来查看,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ```
    print(a.foo)
    # <bound method A.foo of <main.A object at 0xb7d52f0c>>
     
    print(a.class_foo)
    # <bound method type.class_foo of <class 'main.A'>>
     
    print A.class_foo
    <bound method classobj.class_foo of >
     
    print(a.static_foo)
    #
    print(A.static_foo)
    #
    ```

    作用

    • 使用场景:classmethod在一些工厂类的情况下使用较多,也就是说OOP里继承的时候使用,staticmethod一般情况下可以替换为外部的函数,后者继承的时候不可更改,和C++/JAVA中的静态方法很相似

    • 有利于组织代码,同时有利于命名空间的整洁

    以上这篇基于python中staticmethod和classmethod的区别(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

  • 相关阅读:
    2019 Multi-University Training Contest 1
    2019江西省省赛
    2019牛客暑期多校训练营 第二场
    母函数
    树形DP
    蓝桥杯-标题:打印图形
    蓝桥杯-标题:史丰收速算
    蓝桥杯-标题:切面条
    蓝桥杯-标题:李白打酒
    蓝桥杯-标题:啤酒和饮料
  • 原文地址:https://www.cnblogs.com/qunxiadexiaoxiangjiao/p/8322441.html
Copyright © 2011-2022 走看看