python--staticmethod(静态方法)和classmethod(类方法)
Posted yudanqu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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来访问类属性,但不能访问实例属性
- 静态方法无法访问实例变量和类变量,一定要访问的话可以通过传入实例对象的方法手动访问实例变量
以上是关于python--staticmethod(静态方法)和classmethod(类方法)的主要内容,如果未能解决你的问题,请参考以下文章
python staticmethod,classmethod方法的使用和区别以及property装饰器的作用
python@staticmethod&@classmethod&property的理解