classmethod
概念
classmethod是类方法,就是给类使用的方法。通常我们定义一个类,需要先实例化,然后在调用。而使用classmethod则可以让类直接调用。在方法内部,该函数只能访问到类的数据属性,不能获取实例的数据属性。
使用
如图,定义了AB两个类,A方法调用的时候,先进行实例化,再调用,而B方法则可以直接类名加点,点出来。类A如果直接点出来则会报错。
而在类型上,两者也有区别,看下图。
传统的方法定义中,self指代的是一个具体的类实例,可以看到,self等同于实例化后的类A。
而使用classmethod修饰符之后(避免歧义未继续使用self,官方推荐使用cls,当然使用其他也行),cls则表示该类本身,会将类本身当做参数传给类方法的第一个参数。cls在上图代码等同于类B。
特性补充
对“在方法内部,该函数只能访问到类的数据属性,不能获取实例的数据属性”的补充
可以看到,cls.num未报错,可以正常调用。cls调用类中其他方法,也可以调用,但是此时就必须传值了,且传的值会覆盖调用方法中的self。(这里cls.aa(1),覆盖了方法aa中的self,通过打印可以看到aa中self变成了1,而非实例化后的类本身)
而在init中的属性,只能通过实例化之后才能调用,静态方法无法调用(cls.a,报错了)。
staticmethod
概念
staticmethod 静态方法只是名义上归属类管理,但是不能使用类变量和实例变量,是类的工具包
放在函数前修饰,该函数与类本身无关,不传入self或者cls,因此该函数也不能访问类属性和实例属性。
优点是方便将外部函数集成到类体中,美化代码结构,重点在不需要类实例化的情况下调用方法
使用
使用场景:假如一些方法需要的参数(或者没有参数)与self无关,那么不需要传递self,从美化上来说,就可以使用staticmethod来修饰,并且不需要对类进行实例化。
如上代码, 三种方式打印结果一样。now2方法中self显然是多余的,而且要调用还需要先实例化。
而方法now,加上staticmethod进行修饰,可以无需实例化接调用,当做一个普通方式来使用(当然先实例化在调用也不会报错)。