Posted on 2014-04-16 12:01
小夜 阅读(398)
评论(0) 编辑 收藏 引用 所属分类:
[52] Python
最近专职做起了Python,得积累些Python的知识。
-----------------
阅读代码的时候,看到了classmethod。staticmethod用的挺多,classmethod一直没用过,感觉有些迷惑。
Google了一篇文章,讲的挺清楚:
pyhton静态方法和类方法。上面这篇文章主要讲原理,我这里主要说说二者的相同和区别。
- 都可以通过类调用;
- 都可以通过对象调用;
- 都可以继承和复写;
- 都可以使用类属性、类方法和类的静态方法;
- 使用这些属性或方法时,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)