python中类方法、类实例方法、静态方法的使用与区别
2018-04-10 本文已影响0人
大猪厂
# coding = utf-8
class A(object):
def __init__(self, x=0):
self.x = x
# 类实例方法 # 最常见的实例方法
def foo(self, y=0):
print(self.x, y)
# 类方法 # cls即为类自身
@classmethod
def class_foo(cls, x=1, y=1):
return cls(x) # 因为类方法可以传参一个cls参数,所以可以调用类的相关信息,而静态方法是一个独立的函数,也是可以调用的,这里为了简单,没有调用静态方法。
# 静态方法 # 不能传递和类或实例相关的参数,如cls或self,但可以传递其他参数
@staticmethod
def static_foo(x=2):
return A(x)
实例方法隐含的参数为类实例self,而类方法隐含的参数为类本身cls。静态方法无隐含参数,主要为了类实例也可以直接调用静态方法。
定义类方法主要是要加一个装饰器,@classmethod
而实例方法没有这个装饰器。这是区别实例方法和类方法的最主要的区别。
在调用上的区别在于,实例方法要先实例化一个对象再调用这个实例化方法,而类方法不需要有类的实例,直接类名.方法名就可以调用。
实例方法至少有一个参数,通常用self,这个参数里面是这个实例本身。类方法至少有一个参数,通常用cls,这个参数里面是这个类本身。
实例方法由于有实例,所以实例的属性对其实可见的,但类方法显然没有属性。
本质上来讲,类方法和实例方法没有本质区别,只不过在调用的时候,实例方法把这个实例本身当做参数传过去了。
所以逻辑上,类方法应当只被类调用,实例方法实例调用,静态方法两者都能调用。主要区别在于参数传递上的区别,实例方法悄悄传递的是self引用作为参数,而类方法悄悄传递的是cls引用作为参数。
总结
普通方法可以通过self访问实例属性;
类方法,可以通过cls访问类属性;
静态方法,不可以访问,通过传值的方式;