posts - 26, comments - 2, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Python的staticmethod和classmethod

Posted on 2014-04-16 12:01 小夜 阅读(376) 评论(0)  编辑 收藏 引用 所属分类: [52] Python
最近专职做起了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)
    

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理