1。现场前几天,有朋友来找我,问我Python中的@staticmethod、@classmethod、self、cls是什么意思。平时都用,不知道具体是什么意思?事实上,由于Python语言的灵活性,这部分内容在日常编码过程中很容易被忽略。本文就和大家聊聊这些小知识点2.@staticmethod装饰器@staticmethod修饰方法叫做:静态方法,和普通函数没什么区别。下面会讲几个实际项目中的应用场景。1、调用静态方法,一般的使用形式是:"类名.方法名()"classWeb(object):@staticmethoddeffoo_staticmethod():"""静态方法"""passif__name__=='__main__':#直接使用类名+方法名调用Web.foo_staticmethod()当然你也可以实例化一个类对象,这个对象调用一个静态方法,但是不推荐这种方法#实例化一个对象instance=Web()#使用实例对象调用静态方法(不推荐)instance.foo_staticmethod()2.对于类中定义的静态变量,可以使用“类名.变量名”的形式访问classWeb(object):#静态变量(类变量)name="Python_Web"@staticmethoddeffoo_staticmethod():"""Staticmethod"""#引用静态变量print(Web.name)3.静态方法使用其他静态方法和里面的类方法,也用“类名.方法名()”来调用classWeb(object):#staticvariable(classvariable)name="Python_Web"#班级聚会Method@classmethoddeffoo_classmethod_other(cls):print('调用了类方法!')#另一个静态方法@staticmethoddeffoo_staticmethod_other():print('另一个静态方法被调用了!')footh:odf_stat)"""静态方法"""#调用其他静态方法print(Web.foo_staticmethod_other())#调用类方法print(Web.foo_classmethod_other())4.静态方法内部调用普通方法,访问实例属性普通方法和实例attributes都必须通过实例对象来引用,不能直接用类名访问类Web(object):def__init__(self):self.desc="Instanceattributes,notshared"defnorm_method(self):"""普通方法"""print('调用普通方法!')@staticmethoddeffoo_staticmethod():"""静态方法"""instance=Web()#获取实例属性print(instance.desc)thmeodst_in#调用普通方法)5.子类的使用在子类中调用父类定义的静态方法,只需将类名替换为子类名classWeb(object):@staticmethoddeffoo_staticmethod(arg1,arg2):passclassDjango(Web):"""Subclass"""passif__name__=='__main__':#1.使用类名(父类)调用静态方法Web.foo_staticmethod("Hello",",AirPython")#2.使用调用静态方法的类名(子类)Django.foo_staticmethod("Hello",",AirPython")3.@classmethod装饰器@classmethod被@classmethod装饰的方法被调用:类方法,使用时,类本身会被第一个参数cls传递给类方法#类方法,第一个参数是cls,代表类本身@classmethoddeffoo_classmethod(cls):pass其中,cls代表外部类本身,可以实例化也可以直接下面对调用的静态方法、类方法和静态变量一一解释1.调用一个类方法,一般的使用形式是:"类名.方法名()"classWeb(object):#类方法,第一个参数是cls,代表类本身@classmethoddeffoo_classmethod(cls):passif__name__=='__main__':#使用类名调用类方法Web.foo_classmethod()类似于静态方法,也可以实例化一个类对象,通过这个对象调用静态方法,但是不推荐使用this方法二、调用静态变量有两种方式。静态方法内部引用的是静态变量,即:“类名.变量名”“cls.变量名”注:由于cls代表的是外部类本身,所以这两个方法等同于classWeb(object):#Staticvariable(classvariable)name="Python_Web"#类方法,第一个参数是cls,代表类本身@classmethoddeffoo_classmethod(cls):#调用静态变量方法一print(cls.name)#调使用静态变量方法2print(Web.name)3.在类方法内部调用其他类方法,在类方法内部调用静态方法,可以使用“类名.类方法名()”,“类名.静态方法”name()"形式来调用方法classWeb(object):#静态方法@staticmethoddeffoo_staticmethod():print('调用了静态方法!')#其他类方法@classmethoddeffoo_classmethod_other(cls):print('anotherTheclassmethodiscalled!')#类方法,第一个参数是cls,代表类本身@classmethoddeffoo_classmethod(cls):#调用其他类方法cls.foo_classmethod_other()name#调用静态方法cls.foo_static____if=='__main__':Web.foo_classmethod()4.类方法内部调用公共方法。访问实例属性,需要通过cls变量实例化一个类对象,然后使用这个对象调用常用方法和实例属性classWeb(object):def__init__(self):self.desc="实例属性,不是shared"defnorm_method(self):"""Normalmethod"""print('Normalmethodiscalled!')#类方法,第一个参数是cls,代表类本身@classmethoddeffoo_classmethod(cls):#如果想要调用实例属性,必须使用cls实例化一个对象,然后引用它print(cls().desc)#如果要调用普通方法,必须使用cls实例化一个对象,然后参考cls().norm_method()5.子类的使用在子类中调用父类定义的类方法,只需要将类名替换为子类名即可。代码和静态方法类似4.区别下面总结一下普通方法、静态方法、类方法的区别。self代表实例对象本身,可以用self直接引用定义的实例属性和普通方法;如果需要调用静态方法和类方法,可以通过“类名.方法名()”调用静态方法:使用“类名.静态变量”引用静态变量,使用“类名.方法名())”调用其他静态方法和类方法;如果需要调用公共方法,需要先实例化一个对象,然后使用该对象调用公共方法类的方法:第一个参数cls代表类本身(等价的),通过“引用静态变量”cls.static变量”或“类名.static变量”,使用“cls.方法名()”或“类名.方法名()”来调用Static方法和类方法;如果需要调用普通方法,需要先实例化一个对象,然后使用该对象调用普通方法。静态方法和类方法是为类定义的。除了使用类名来调用,还可以使用实例对象来调用,但不推荐\5.最后,一般来说,如果方法涉及实例对象属性的操作,建议使用普通方法;如果方法内部没有对实例属性的操作,只包含一些工具性操作,建议使用静态方法;而如果需要对类属性,即静态变量进行限制性操作,建议使用类方法。以上就是本次分享的全部内容。觉得文章还不错的话,请关注公众号:Python编程学习圈,每日干货分享,发送“J”还能收到海量学习资料,涵盖Python电子书、教程、数据库编程、Django、爬虫、云计算等或者去编程学习网了解更多编程技术知识。
