透过代码理解python的静态方法、类方法与实例方法

话不多说,直接上程序:

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。

posted on 2016-11-16 17:31  lc_D_a  阅读(381)  评论(0编辑  收藏  举报

导航