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访问类属性;
静态方法,不可以访问,通过传值的方式;

上一篇下一篇

猜你喜欢

热点阅读