抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

classmethod

概念

classmethod是类方法,就是给类使用的方法。通常我们定义一个类,需要先实例化,然后在调用。而使用classmethod则可以让类直接调用。在方法内部,该函数只能访问到类的数据属性,不能获取实例的数据属性。

使用

image.png

如图,定义了AB两个类,A方法调用的时候,先进行实例化,再调用,而B方法则可以直接类名加点,点出来。类A如果直接点出来则会报错。

而在类型上,两者也有区别,看下图。

image.png

传统的方法定义中,self指代的是一个具体的类实例,可以看到,self等同于实例化后的类A。

而使用classmethod修饰符之后(避免歧义未继续使用self,官方推荐使用cls,当然使用其他也行),cls则表示该类本身,会将类本身当做参数传给类方法的第一个参数。cls在上图代码等同于类B。

特性补充

对“在方法内部,该函数只能访问到类的数据属性,不能获取实例的数据属性”的补充

image.png

可以看到,cls.num未报错,可以正常调用。cls调用类中其他方法,也可以调用,但是此时就必须传值了,且传的值会覆盖调用方法中的self。(这里cls.aa(1),覆盖了方法aa中的self,通过打印可以看到aa中self变成了1,而非实例化后的类本身)

而在init中的属性,只能通过实例化之后才能调用,静态方法无法调用(cls.a,报错了)。

staticmethod

概念

staticmethod 静态方法只是名义上归属类管理,但是不能使用类变量和实例变量,是类的工具包

放在函数前修饰,该函数与类本身无关,不传入self或者cls,因此该函数也不能访问类属性和实例属性。

优点是方便将外部函数集成到类体中,美化代码结构,重点在不需要类实例化的情况下调用方法

使用

使用场景:假如一些方法需要的参数(或者没有参数)与self无关,那么不需要传递self,从美化上来说,就可以使用staticmethod来修饰,并且不需要对类进行实例化。

image.png

如上代码, 三种方式打印结果一样。now2方法中self显然是多余的,而且要调用还需要先实例化。

而方法now,加上staticmethod进行修饰,可以无需实例化接调用,当做一个普通方式来使用(当然先实例化在调用也不会报错)。

评论