• 技术文章 >后端开发 >Python教程

    对于初学者如何理解 @classmethod 和@staticmethod

    anonymityanonymity2019-06-05 14:24:37原创1817
    staticmethod相当于一个定义在类里面的函数,所以如果一个方法既不跟实例相关也不跟特定的类相关,推荐将其定义为一个staticmethod,这样不仅使代码一目了然,而且似的利于维护代码。

    子类调用方法隐形传入的参数为该对象所对应的类,调用过程中动态生成了对应的类的类变量。

    理解classicmethod和staticmethod类是一种数据结构,可以创建对象。当调用类的时候就创建了一个类的实例对象。一旦对象被创建,python 就会检查是否实现了init()方法。如果init()已经被实现,那么它将被调用,实例对象作为第一个参数(self)被传递进去。

    举个例子,定义一个存储日期信息的类Date,这里重新定义了初始化函数。

    class Date(object):
     
        day = 0
        month = 0
        year = 0
     
        def __init__(self, day=0, month=0, year=0):
            self.day = day
            self.month = month
            self.year = year
        def tellDate(self):
            print 'Today is %s-%s-%s'%(self.day,self.month,self.year)

    如果我们需要调用tell Date方法,我们就必须先创建一个实例,或者使用Date().tellDate()

    date1 = Date()
    date1.tellDate()

    如何直接使用类名调用函数呢?

    使用@classmethod或@staticmethod都可以类名.方法名()调用函数

    现在假设我们需要创建很多Date的实例,日期信息以字符串的形式从外部传入,格式为'dd-mm-yyyy'。需要做的事

    将日期信息字符串parse成一个含有年月日三个变量的元组;

    实例化一个Date对象时就将年月日作为参数传入。

    就像这样:

    day, month, year = map(int, string_date.split('-'))
    date1 = Date(day, month, year)

    python不能像C++那样进行重载,所以我们引入class method ,它不需要self参数,但需要第一个参数是表示自身类的cls参数。

    @classmethod
        def from_string(cls, date_as_string):
            day, month, year = map(int, date_as_string.split('-'))
            date1 = cls(day, month, year)
            return date1

    使用时可以直接类名.方法名()

    这样编程的好处有:

    分解字符串操作可以重复使用,而我们只需要传入参数一次;

    OOP;

    cos是类本身,而不是类的实例,当我们将Date作为父类时,其子类也会拥有from_string方法

    和class method很相似的是staticmethod,但它不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。

    @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 <= 3999

    所有程序及运行结果

    class Date(object):
        day = 0
        month = 0
        year = 0
     
        def __init__(self, day=0, month=0, year=0):
            self.day = day
            self.month = month
            self.year = year
            
        def tellDate(self):
            print 'Today is %s-%s-%s'%(self.day,self.month,self.year)
        @classmethod
        def from_string(cls, date_as_string):
            day, month, year = map(int, date_as_string.split('-'))
            date = cls(day, month, year)
            return 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 <= 3999
     
    if __name__ == '__main__':
        date1 = Date()
        date1.tellDate()
        date2 = Date.from_string("14-04-2016")
        date2.tellDate()
        print Date.is_date_valid("14-04-2016")

    运行结果为:

    Today is 0-0-0
    Today is 14-4-2016
    True

    以上就是对于初学者如何理解 @classmethod 和@staticmethod的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:python
    上一篇:PYTHON:如何增加文件的内容 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • Python如何测量脚本运行时间• 在 Python 中如何得到对象的所有属性• python如何在循环中获取下标• python占位符怎么输入
    1/1

    PHP中文网