Python的staticmethod和classmethod

最近专职做起了Python,得积累些Python的知识。
-----------------
阅读代码的时候,看到了classmethod。staticmethod用的挺多,classmethod一直没用过,感觉有些迷惑。
Google了一篇文章,讲的挺清楚: pyhton静态方法和类方法。上面这篇文章主要讲原理,我这里主要说说二者的相同和区别。
  1. 都可以通过类调用;
  2. 都可以通过对象调用;
  3. 都可以继承和复写;
  4. 都可以使用类属性、类方法和类的静态方法;
  5. 使用这些属性或方法时,staticmethod必须直接通过类名进行调用,classmethod可以优雅的通过参数cls调用。
在进行属性或方法调用时:staticmethod需要硬编码指明方法的类,如果存在继承,无法使用子类复写的方法和属性,比较适合用于对其他方法和属性不依赖或依赖较少的情况;classmethod通过cls进行调用,这个cls是调用时传入的类,可以是父类,也可以是子类,适合用于对其他方法和属性依赖较多的情况,也适用于需要通过集成扩展的情况。

下面的代码,简单试验了两者的区别,并通过staticmethod简单的模拟了classmethod的操作:

class Base(object):
    name =  " Base "
    
    @classmethod
     def foo(cls):
         print cls.name
    
    @staticmethod
     def foo_static1():
         print Base.name
    
    @staticmethod
     def foo_static2(cls):
         print cls.name

    @staticmethod
     def foo_static3(cls):
         #  if not isinstance(cls, type):
         if isinstance(cls, Base):
            cls = cls. __class__
         print cls.name


class A(Base):
    name =  " A "
     def  __init__(self):
        self.name =  " I am '%s' " % A.name
        

class B(Base):
    name =  " B "
     def  __init__(self):
        self.name =  " I am '%s' " % B.name
    
    @classmethod
     def foo(cls):
         print  " <%s> " % cls.name
    
    @staticmethod
     def foo_static1():
         print  " <%s> " % Base.name


def testA():
    obj = A()
    obj.foo()
    obj.foo_static1()
    obj.foo_static2(A)
    obj.foo_static2(obj)
    obj.foo_static3(A)
    obj.foo_static3(obj)
    A.foo()
    A.foo_static1()

def testB():
    obj = B()
    obj.foo()
    obj.foo_static1()


def run_test(func, *args, **kwargs):
     print  " ======================= "
    func(*args, **kwargs)
     print  ""


if  __name__ ==  ' __main__ ':
    run_test(testA)
    run_test(testB)
    

你可能感兴趣的:(Python的staticmethod和classmethod)