python学习-Python面试提升之高阶技巧:staticmethod 和classmethod.pdfVIP

python学习-Python面试提升之高阶技巧:staticmethod 和classmethod.pdf

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
python学习-Python面试提升之高阶技巧:staticmethod 和classmethod.pdf

精品课程 中国IT职业教育领先品牌 全程面授 python 学习-Python 面试提升之高阶技巧:staticmethod 和classmethod 因为最近用Python 写了一个调度工具,全程都是面向对象的,有同事看过代码后,问到了 classmethod 和staticmethod 这两个方法的区别。 于是写下这篇文章来记录一下。 (注:本 文中的示例的部份过程是参照了stackoverflow 中的优秀回答: /questionsmeaning-of-classmethod-and-staticmethod-for- beginner14605349) Python 是一门面向对象的语言,在Python 里everything is object。在根据设计模式来进行开 发的时候,classmethod 和staticmethod 就会被经常使用到。虽然classmethod 和staticmethod 非常相似,但两个实体的使用情况略有不同。 @classmethod 意味着:当调用此方法时,我们将该类作为第一个参数传递,而不是该类的 实例(正如我们通常使用的方法)。这意味着您可以使用该方法中的类及其属性,而不是特定 的实例。 @staticmethod 意味着:当调用此方法时,我们不会将类的实例传递给它(正如我们通常使用 的方法)。这意味着你可以在一个类中放置一个函数,但是你无法访问该类的实例(当你的方 法不使用实例时这很实用)。 下面我们通过实例来看看什么时候可以用classmethod,什么时候可以用staticmethod。 先看一个时间的类: 这个类可以存储时间相关的信息,初始化的时候需要按顺序传入3 个参数,分别是日,月, 年。 接下来,我们遇到一个问题,我们要用很多时间数据来实例化这个类,但是数据的格式却是 (‘dd-mm-yyyy’) 这样的,要怎么办呢? 这个时候classmethod 就非常好用: 千锋教育 精品课程 中国IT职业教育领先品牌 全程面授 在类里添加上面这个函数,就可以完美解决这个问题。学过C++的同学可能已经明白了,这 里有点像C++里的重载。 从这里我们可以看到classmethod 会有这些好处: 我们在一个地方实现了日期字符串解析,现在可以重用。 封装在这里工作正常(如果您认为您可以在其他地方将字符串解析为单个功能,则该解决方 案可以更好地适应OOP 范例)。 cls 是一个持有类本身的对象,而不是类的一个实例。这是非常酷的,因为如果我们继承了 我们的Date 类,所有的子类也将定义from_string。 那么staticmethod 可以解决什么问题呢? 这里假设需要对时间进行校验,就可以用下面这个staticmethod 来完成: 可以看出来,staticmethod 定义的方法在逻辑上是属于这个类的,但在调用的时候却不需要 任何类的实例化。 classmethod 和staticmethod 在用法上确实有点相似,但在使用场景上还是有区别的。最后 看一个例子: 从上面这个例子里可以看出来,要改变基于哪个子类调用该方法的方法的行为时,可以使用 @classmethod,因为我们在类方法中引用了调用类。而在使用静态方法时,我们希望该行为 在子类之间保持不变。 千锋教育

文档评论(0)

tangtianxu1 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档