博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python3-staticmethod与classmethod
阅读量:6152 次
发布时间:2019-06-21

本文共 2268 字,大约阅读时间需要 7 分钟。

classmethod:类方法

staticmethod:静态方法

在Python中,静态方法和类方法都是可以通过类对象和类对象实例访问。但是区别是:

@classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。

普通对象方法至少需要一个self参数,代表类对象实例

类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。

对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。

静态方法则没有,它基本上跟一个全局函数相同,一般来说用的很少

classmethod必须使用类对象作为第一个参数,而staticmethod则可以不传递任何参数。

class Date:    def __init__(self,day=0, month=0, year=0):        self.day=day        self.month = month        self.year = year    @classmethod    def from_string(cls, date_as_string):        day, month, year = map(int,date_as_string.split('-'))        my_date = cls(day, month, year)        return my_date    @staticmethod    def is_date_valid(date_as_string):        day, month, year = map(int, date_as_string.split('-'))        return day <= 31 and month <= 12 and year <= 3999if __name__ == '__main__':    my_date = Date.from_string('11-09-2012')    print(my_date.day, my_date.month,my_date.year)    is_date = Date.is_date_valid('13-13-2012')    print(is_date)outputs: 11 9 2012False

在来看另外的例子,为了验证有子类继承时,子类调用该类方法时,传入的类变量cls是子类,而非父类

class A:    @classmethod    def cm(cls):        print('类方法cm(cls)调用者:', cls.__name__)    @staticmethod    def sm():        print('静态方法sm()被调用')class B(A):    passA.cm()  # 类方法cm(cls)调用者: AB.cm()  # 类方法cm(cls)调用者: BA.sm()  # 静态方法sm()被调用B.sm()  # 静态方法sm()被调用

下面我们来看为什么要用到staticmethod与classmethod。

class Kls:    def __init__(self,data):        self.data = data    def printd(self):        print(self.data)ik1=Kls('arun')ik2=Kls('seema')ik1.printd()ik2.printd()# 如果现在我们想写一些仅仅与类交互而不是和实例交互的方法会怎么样呢? 我们可以在类外面写一个简单的方法来做这些,# 但是这样做就扩散了类代码的关系到类定义的外面. 如果像下面这样写就会导致以后代码维护的困难:def get_no_of_instances(cls_obj):    return cls_obj.no_instclass Kls:    no_inst = 0    def __init__(self):        Kls.no_inst = Kls.no_inst + 1ik1 = Kls()ik2 = Kls()print(get_no_of_instances(Kls)) # 2

应用classmethod

class Kls(object):    no_inst = 0    def __init__(self):        Kls.no_inst = Kls.no_inst + 1    @classmethod    def get_no_of_instance(cls_obj):        return cls_obj.no_instik1 = Kls()ik2 = Kls()print(ik1.get_no_of_instance())print(Kls.get_no_of_instance())# 2# 2

@staticmethod

经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法

转载地址:http://snzfa.baihongyu.com/

你可能感兴趣的文章
怎样成为一个高手观后感
查看>>
[转]VC预处理指令与宏定义的妙用
查看>>
JQuery radio单选框应用
查看>>
MySql操作
查看>>
python 解析 XML文件
查看>>
MySQL 文件导入出错
查看>>
java相关
查看>>
由一个异常开始思考springmvc参数解析
查看>>
向上扩展型SSD 将可满足向外扩展需求
查看>>
虚机不能启动的特例思考
查看>>
SQL Server编程系列(1):SMO介绍
查看>>
在VMware网络测试“专用VLAN”功能
查看>>
使用Formik轻松开发更高质量的React表单(三)<Formik />解析
查看>>
也问腾讯:你把用户放在什么位置?
查看>>
CSS Sprites 样式生成工具(bg2css)
查看>>
[转]如何重构代码--重构计划
查看>>
类中如何对list泛型做访问器??
查看>>
C++解析XML--使用CMarkup类解析XML
查看>>
P2P应用层组播
查看>>
Sharepoint学习笔记—修改SharePoint的Timeouts (Execution Timeout)
查看>>