python--staticmethod(静态方法)和classmethod(类方法)

 

一、静态方法(staticmethod)

  • 静态方法是通过@staticmethod 装饰器,将普通方法装饰为一个静态方法。
  • 静态方法在类中不必传入self参数,不能访问类变量和实例变量。下面先写一个静态方法的例子:
 1 class ClassName(object):
 2     """docstring for ClassName"""
 3     def __init__(self, arg):
 4         self.arg = arg
 5 
 6     @staticmethod
 7     def foo():
 8         print('**************')
 9 
10 a = ClassName(8)
11 a.foo()

  这里面的foo方法就被装饰为了一个静态方法,他不能访问类变量和实例变量,可以调用。

  在创建实例时,不会自动把实例本身当做参数传给self,因此在方法中不必写参数self,如果写上了self,由于没有自动把实例传给它,那么会报错说这里应有一个参数但是没有传入。这就是所说的,静态方法不能访问实例变量和类变量,如果想不报错,要么老老实实的不要传self参数,就做一个独立方法,这时,这个静态方法和类也就没什么太大的联系的,只不过是相当于处于这个命名空间内。还有一个方法就是,他没有自动把实例对象传给self参数,那么我们可以人为的把这个实例传进去。

  上面的代码就是第一种情况,既然不能访问实例变量类变量,就不传参数,不访问,下面是人为传入一个对象。

 1 class ClassName(object):
 2     """docstring for ClassName"""
 3     def __init__(self, arg):
 4         self.arg = arg
 5 
 6     @staticmethod
 7     def foo(self):
 8         print('**************',self.arg)
 9 
10 a = ClassName(8)
11 a.foo(a) # 调用这个静态方法时,由于里面有self参数,那么就把上面创建好的对象传给self
12 
13 ClassName.foo(a) # 这句代码表示,静态方法可以直接通过类名来调用,而普通方法不可以

二、类方法(classmethod)

  • 通过@classmethod 装饰的方法为类方法。
  • 类方法只能访问类变量,不能访问实例变量。
  • 当我们直接访问初始化后的实例变量时,会提示没有这个属性(AttributeError: type object 'ClassName' has no attribute 'arg')
 1 class ClassName(object):
 2     """docstring for ClassName"""
 3 
 4     name = 'pig' # 这是一个类属性
 5 
 6     def __init__(self, arg): # init初始化的是实例属性和实例方法,这里只写了一个属性
 7         self.arg = arg
 8     
 9     @classmethod
10     def foo(cls): #类方法参数默认写为cls
11         print('**************',cls.name)
12 
13 a = ClassName(8)
14 a.name = 'cat' # 这里我通过一个实例对象将name改变了,后面输出可以看到,foo方法并没有改变,印证了类方法无法访问实例变量
15 a.foo()
16 
17 ClassName.foo() # 同样,类方法也可以直接通过类名来调用

三、总结

  • 普通方法不能直接通过类名来调用,而静态方法和类方法可以
  • 访问:
    • 普通方法可以通过self来访问实例属性
    • 类方法可以通过cls来访问类属性,但不能访问实例属性
    • 静态方法无法访问实例变量和类变量,一定要访问的话可以通过传入实例对象的方法手动访问实例变量

猜你喜欢

转载自www.cnblogs.com/yudanqu/p/9248061.html