[转载] python classmethod存在的意义_@classmethod和@staticmethod对初学者的意义?

参考链接: Python classmethod()

尽管classmethod和staticmethod非常相似,但这两个实体的用法略有不同:classmethod必须将对类对象的引用作为第一个参数,而staticmethod则完全没有参数。

 示例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')

 解释

 让我们假设一个类的例子,处理日期信息(这将是我们的样板文件):class Date(object):

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

 self.day = day

 self.month = month

 self.year = year

 这个类显然可以用来存储关于某些日期的信息(没有时区信息;假设所有日期都以UTC表示)。

 这里有一个Python类实例的典型初始值设定项__init__,它以典型的instancemethod形式接收参数,第一个非可选参数(self)保存对新创建实例的引用。

 类方法

 我们有一些任务可以使用classmethod很好地完成

 假设我们要创建许多类实例,其中的日期信息来自外部源,编码为格式为“dd-mm-yyy”的字符串。假设我们必须在项目的源代码中的不同位置执行此操作。

 所以我们必须做的是:解析一个字符串,将日、月和年作为三个整数变量或由该变量组成的三项元组接收。

 通过将这些值传递给初始化调用来实例化Date。

 这看起来像:day, month, year = map(int, string_date.split('-'))

 date1 = Date(day, month, year)

 为此,C++可以实现具有过载的特性,但Python没有这种重载。相反,我们可以使用classmethod。让我们创建另一个“构造函数”。@classmethod

 def from_string(cls, date_as_string):

 day, month, year = map(int, date_as_string.split('-'))

 date1 = cls(day, month, year)

 return date1

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

 让我们更仔细地看一下上面的实现,并回顾一下我们在这里有哪些优势:我们在一个地方实现了日期字符串解析,现在可以重用了。

 封装在这里工作得很好(如果您认为可以在其他地方将字符串解析作为单个函数实现,那么这个解决方案更适合OOP范式)。

 cls是一个保存类本身的对象,而不是类的实例。这很酷,因为如果我们继承我们的Date类,所有的子类都将定义from_string。

 静态方法

 那staticmethod呢?它与classmethod非常相似,但不接受任何必需的参数(就像类方法或实例方法那样)。

 让我们看看下一个用例。

 我们有一个日期字符串,我们想以某种方式验证它。这个任务在逻辑上也绑定到我们目前使用的Date类,但不需要实例化它。

 这里是staticmethod有用的地方。让我们看下一段代码:@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

 # usage:

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

 因此,正如我们从staticmethod的用法中看到的,我们没有任何访问类的权限——它基本上只是一个函数,在语法上称为方法,但没有访问对象及其内部(字段和其他方法)的权限,而classmethod有。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值