静态方法更类似与这个类有某些关联的函数 实际上并没有要求一定要接收此类相关的参数
类方法的第一个参数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>