classmethod和staticmethod区别

    xiaoxiao2025-01-25  78

    python 类语法中有三种方法,实例方法,静态方法,类方法。

    普通实例方法,第一个参数需要是self,它表示一个具体的实例本身。

    如果用了staticmethod,那么就可以无视这个self,而将这个方法当成一个普通的函数使用。

    而对于classmethod,它的第一个参数不是self,是cls,它表示这个类本身。

     

    实例方法,第一个参数必须要默认传实例对象,一般习惯用self。必须要实例化。静态方法,参数没有要求。可以实例化也可以不实例化。

    类方法,第一个参数必须要默认传类,一般习惯用cls。可以实例化也可以不实例化。

    # -*- coding: utf-8 -*- """ Created on Sat May 25 19:42:21 2019 @author: dongyang """ # coding:utf-8 class A(object): """类三种方法语法形式""" def instance_method(self): print("是类{}的实例方法,只能被实例对象调用".format(A)) @staticmethod def static_method(): print("是静态方法") @classmethod def class_method(cls): print("是类方法") B= A() B.instance_method() B.static_method() B.class_method() print('----------------') A.static_method() A.class_method()

     

    结果:

    是类<class '__main__.A'>的实例方法,只能被实例对象调用 是静态方法 是类方法 ---------------- 是静态方法 是类方法

     

    2.类⽅法的用途

    类⽅法⼀个⽤途就是可以对类属性进⾏修改在⽤类⽅法对类属性修改之后,通过类对象和实例对象访问都发⽣了改变

    类⽅法的第⼀个参数是类对象cls,那么通过cls引⽤的必定是类对象的属性和⽅法;⽽实例⽅法的第⼀个参数是实例对象self,那么通过self引⽤的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更⾼。静态⽅法中不需要额外定义参数,因此在静态⽅法中引⽤类属性的话,必须通过类对象来引⽤。

    # -*- coding: utf-8 -*- """ Created on Sat May 25 19:59:31 2019 """ class People(object): country = 'china' @classmethod def getCountry(cls): return cls.country @classmethod def setCountry(cls,country): cls.country = country p = People() print(p.getCountry()) #可以⽤过实例对象引⽤ print(People.getCountry()) #可以通过类对象引⽤ p.setCountry('japan') print(p.getCountry()) print(People.getCountry())

    结果:

    china china japan japan

    3.静态⽅法

    静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作。可以理解为将静态方法存在此类的名称空间中。事实上,在python引入静态方法之前,通常是在全局名称空间中创建函数。

     

    4.区别

     

    Staticmethod 无法访问类属性,实例属性

    Classmthod  可以访问类属性,无法访问实例属性

     

    最新回复(0)