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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值