话不多说,直接上程序:
a = 111
class A(object):
a = 1
def f_instance(self):
print self.a
@staticmethod
def f_static():
print a
@classmethod
def f_class(cls):
print cls.a
aaa = A()
A.f_class() #1
A().f_class() #1
aaa.f_class() #1
A.f_static() #111
A().f_static() #111
aaa.f_static() #111
A.f_instance() # TypeError
A().f_instance() #1
aaa.f_instance() #1
f_static() #NameError
aaa.a = 2
A.f_class() #1
A().f_class() #1
aaa.f_class() #1
A.f_static() #111
A().f_static() #111
aaa.f_static() #111
A.f_instance() # TypeError
A().f_instance() #1
aaa.f_instance() #2
f_static() #NameError
A().a = 2; aaa.a=1 #基于上一步的赋值
A.f_class() #1
A().f_class() #1
aaa.f_class() #1
A.f_static() #111
A().f_static() #111
aaa.f_static() #111
A.f_instance() # TypeError
A().f_instance() #1
aaa.f_instance() #1
f_static() #NameError
A.a = 10 #基于上一步的赋值
A.f_class() #10
A().f_class() #10
aaa.f_class() #10
A.f_static() #111
A().f_static() #111
aaa.f_static() #111
A.f_instance() # TypeError
A().f_instance() #10
aaa.f_instance() #1
f_static() #NameError
总结如下:
静态方法 : 和在类外面 定义的方法 效果一样,只不过该方法是类专有的,在外部不可直接访问。类和实例都可以调用。
类方法 : 相当于所有的 该类的 实例的 “党章”,它的改变 能够影响 之后新的实例中的 实例属性,但是对旧的实例(在类属性改变之前所定义的实例)没有影响。实例也可以调用该方法,和类调用的效果相同,返回的是类属性。
实例方法:只能在实例化之后被调用,只能影响实例属性,不能影响类属性,并且实例属性在被实例化之后不受类方法的影响,实例化之后也不因类属性改变而改变。类不可以调用,会返回TypeError。