zoukankan      html  css  js  c++  java
  • python中 staticmethod与classmethod区别

    staticmethod与classmethod区别

    参考
    例子
    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()
    

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

    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来查看,如下:

      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 <class __main__.A at 0x105efedb8>>
      
      print(a.static_foo)
      # <function static_foo at 0xb7d479cc>
      print(A.static_foo)
      # <function static_foo at 0xb7d479cc>
      
    作用
    • 使用场景:classmethod在一些工厂类的情况下使用较多,也就是说OOP里继承的时候使用,staticmethod一般情况下可以替换为外部的函数,后者继承的时候不可更改,和C++/JAVA中的静态方法很相似
    • 有利于组织代码,同时有利于命名空间的整洁
  • 相关阅读:
    Inside The C++ Object Model
    Inside The C++ Object Model
    奇偶剪枝算法
    HDU 1088 Write a simple HTML Browser
    HDU 1084 What Is Your Grade?
    二分图的最大匹配(匈牙利算法)HDU1083
    来自codeblock 贴吧
    HDU 1075 What Are You Taking About
    HDU 1082 Matrix Chain Multiplication
    pair模板类
  • 原文地址:https://www.cnblogs.com/wswang/p/7717993.html
Copyright © 2011-2022 走看看