类装饰器classmethod and staticmethod

介绍

知乎论坛,各大博文都已经关于这个问题的介绍炸锅了,介绍的东西太多了,但是基于每个人的层次不同,理解不同,也有好多初学者,一知半解的记录博客,参考这些博客时,有时候会问题百出,因此参考原汁原味的东西才能获取更好更直接的理解。

二话不说

  • classmethod是将类本身给传进来,因此在类方法中如果再次调用实例的方法时,通常采用cls().fmethod()
    二话不说,举例说明,用一个例子

经典区别案例1

class Date(object):

    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('-'))
        date1 = cls(day, month, year)
        return date1

    @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

date2 = Date.from_string('11-09-2012')
is_date = Date.is_date_valid('11-09-2012')

print(date2.day)
print(is_date)
运行结果:
11
True

经典实用案例2

class Coordinate:
    """
    类:创建坐标系
    """
    def point(self,iterable:list):
        """
        :param iterable 传入列表
        函数会根据列表中的元素组织坐标系
        """
        locate = []

        for i,v in enumerate(iterable):
            locate.append(v)

            if i%2 == 1:
                yield tuple(locate)
                locate.clear()

    @classmethod
    def outpoint(cls,iterable):
        """
        :param iterable是列表
        """
        yield from cls().point(iterable)

经典综合案例3

class Datetime(object):
    """
    时间类
    """
    day = 0
    month = 0
    year = 0

    def __init__(self,year=0,month=0,day=0):

        self.day = day
        self.month = month
        self.year = year

    @classmethod
    def strtime(cls,strdate):

        year,month,day = list(map(int,strdate.rsplit("-")))
        #再次通过类方法创建实例
        datetime = cls(year,month,day)

        return datetime

    def printime(self):
        print("year:{}".format(self.year))
        print("month:{}".format(self.month))
        print("date:{}".format(self.day))

Datetime.strtime(stm).printime()

总结

classmethod类方法

  • 在类定义中,实用@classmethod装饰器修饰的方法
  • 必须至少有一个参数,且第一个参数留给cls,cls指代调用者即类对象本身
  • cls这个标识符可以是任意合法名称,但是为了易读,请不要修改
  • 通过cls可以直接操作类的属性

staticmethod类方法

  • 在类定义中,实用@staticmethod装饰器修饰的方法
  • 调用时,不会隐式的传入参数
  • 静态方法,只是表明这个方法属于这个名词空间,函数归在一起,方便组织管理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值