python classmethod与staticmethod

静态方法更类似与这个类有某些关联的函数 实际上并没有要求一定要接收此类相关的参数

类方法的第一个参数cls 不管是由类调用还是实例调用 会自动传入类类型 (如果是继承类调用则会是子类类型)

实例方法第一次参数self 由实例对象调用时自动传入 如果由类调用需要手动传入实例

# -*- coding:utf-8 -*-
#!/usr/bin/python

class C1(object):
        
        def __init__(self):
            pass
        
        def instance_method(self):
            print(self)
        
        @staticmethod
        def static_method():
            pass
        
        @classmethod
        def class_method(cls):
            print(cls)

class C2(C1):
    
    pass

c1=C1()
print(C1.instance_method)
print(c1.instance_method)
print("---------------------------------")
print(C1.static_method)
print(c1.static_method)
print("---------------------------------")
print(C1.class_method)
print(c1.class_method)
print("---------------------------------")
c2=C2()
C1.class_method()
c1.class_method()
C2.class_method()
c2.class_method()

# 类调用实例方法可以自行传入实例对象 传入非此类实例会报错
C1.instance_method(c1)

结果如下
关于实例方法可以看出 实例对象的此方法会自动绑定到实例对象上
关于类方法可可以看出 类方法会自动绑定到类上
关于静态方法可以看出 实际上与这个类没什么关系 如上所诉可以当作与此类有一定关系的全局函数 可以更加具有内聚性

<unbound method C1.instance_method>
<bound method C1.instance_method of <__main__.C1 object at 0x7f83a656e390>>
---------------------------------
<function static_method at 0x7f83a65697d0>
<function static_method at 0x7f83a65697d0>
---------------------------------
<bound method type.class_method of <class '__main__.C1'>>
<bound method type.class_method of <class '__main__.C1'>>
---------------------------------
<class '__main__.C1'>
<class '__main__.C1'>
<class '__main__.C2'>
<class '__main__.C2'>
<__main__.C1 object at 0x7f83a656e390>
发布了40 篇原创文章 · 获赞 0 · 访问量 2594

猜你喜欢

转载自blog.csdn.net/u010571102/article/details/103430292