先上一段摘来的代码,这段代码运行一下会更好的理解这三类方法的区别
# -- coding: utf-8 --
class Test(object):
def __init__(self):
self.name = 'leon'
def InstanceFun(self): #实例方法,通过实例调用。实例方法隐含的参数为类实例
print("InstanceFun")
print(self.name)
@classmethod
def ClassFun(cls): #类方法,理论上通过类调用,实际上也可以通过实例调用。类方法隐含的参数为类本身。
print("ClassFun")
print(cls)
@staticmethod
def StaticFun(): #静态方法,通过实例化的对象调用,也可以直接通过类调用。静态方法无隐含参数,主要为了类实例也可以直接调用静态方法。
print("StaticFun")
t = Test()
Test.InstanceFun()
t.InstanceFun()
Test.ClassFun()
t.ClassFun()
Test.StaticFun()
t.StaticFun()
尝试运行Test.InstanceFun()报错,报错信息如下。 尝试运行 t.InstanceFun()正常。
运行Test.InstanceFun()报错
这个说明实例方法,只能通过实例调用。
运行Test.ClassFun()、t.ClassFun()、Test.StaticFun()、t.StaticFun()均成功,说明类方法和静态方法都能通过实例化的对象调用,也可以直接通过类调用。
总结一下:
1、实例方法,通过实例调用。实例方法隐含的参数为类实例。
2、类方法,理论上通过类调用,实际上也可以通过实例调用。类方法隐含的参数为类本身。
3、静态方法,通过实例化的对象调用,也可以直接通过类调用。静态方法无隐含参数,可以不接收参数,主要为了类实例也可以直接调用静态方法。
类方法和静态方法皆可以访问类的静态变量(类变量),但不能访问实例变量,ClassFun、StaticFun是不能访问self.name的,而InstanceFun则可以。
如有错误,还望指正
网友评论