Python静态方法,其实暗藏玄机

文章首发于 微信公众号:Python编程时光编程

这个标题「静态方法其实暗藏玄机」其实只是该文章的一个知识点。或许有些标题党,但没有关系,我相信有很多人对此并无深刻研究他们,不信我问你三个问题,你看可否答上来。微信

一、Python2.x和3.x中,函数和方法的区分有什么不一样?函数

二、有了类/实例方法和普通函数,为何还会有静态方法?工具

三、Python3.x 中,静态方法有几种写法?测试

带着这三个问题,你能够尝试在下文中寻找答案。设计


在 Python 2 中的函数和方法的区别,十分清晰,很好分辨。但在 Python3中,我却发现彻底又是另外一套准则。3d

首先先来 Python2 的(如下在 Python2.7中测试经过)code

能够得出结论:cdn

一、普通函数(未定位在类里),都是函数。对象

二、静态方法(@staticmethod),都是函数。

三、类方法(@classmethod),都是方法。

四、实例方法(首参数为self且非静态、非类方法的),都是方法。

你必定想说,类方法和实例方法,是方法没错呀,毕竟名字自己就有方法,普通函数是函数,我也理解呀。那静态方法,为何不是方法而是函数呢?

名字只是一个外在的表面称呼,你能说「赵铁男」就必定是汉子吗?

个人理解是:方法是一种和对象(实例或者类)绑定后的函数。

类方法的首参是cls,调用时,无需显示传入。实例方法首参是self,调用时,也无需显示传入。

而静态方法,其实和普通函数没啥区别,惟一的区别就是,他定义的位置被放在了类里,作为类或者实例的一个函数。

那你确定又要问了,既然静态方法和普通函数都是同样的,为何要刻意将它放在类里呢?

我上面说了,放在类里定义,就可让它成为类的一个工具函数,这就像你身上随身携带了一把刀,这把刀与你本人并无什么直接关系,惟一的联系就是这把刀是你的,而你把它带在身上,不管你去到哪里,只要须要,你就能够直接拿出来用上。对比将函数放在类外面,缺点是什么呢?就是当你出门在外(在别的模块里)发现你要用刀的时候,还要特意跑一趟去商店买一把刀(import 这个函数)。

另外,我以为静态方法在业务和设计上的意义,会更多一些。

通常静态方法是作为类或者实例的一个工具函数,好比对变量的作一个合法性的检验,对数据进行序列化反序列化操做等等。

说完了 Python2 ,再来讲说Python3.

之前我以为 Python2 对于方法和函数的界线更加清晰,但接触了 Python3,我反而以为Python3里方法和函数的区分彷佛更加合理。

仍是刚刚那段代码,我更改了解释器为Python3.6(如下在 Python3.6中测试经过)

和Python2的惟一区别是,People.jump 在Python3 中变成了函数。

这一下颠覆了你刚刚才创建起来的知识体系有木有?

先别急,我再作个试验,也许你就知道了。

在 Python2中

执行People.jump('hello'),会报错说,jump的首参必须为People的实例对象,这能够理解,毕竟jump定义时,第一个参数为self。

在 Python3中

你能够发现,这里的jump的首参再也不要求是 People 的一个实例,而能够是任意的对象,好比我使用字符串对象,也没有报错。

也就是说,当你往jump中传入的首参为People的实例时,jump 就是方法,而当你传入的首参不是People的实例对象时,jump就是函数。

你看,多么灵活呀。

再总结一下,在Python3中:

一、普通函数(未定位在类里),都是函数。

二、静态方法(@staticmethod),都是函数。

三、类方法(@classmethod),都是方法。

四、方法和函数区分没有那么明确,而是更加灵活了,一个函数有多是方法也有多是函数。

你确定又要问了,那这是否是就意味着,Python3 中静态方法,能够不用再使用@staticmethod 装饰了呢,反正Python3均可以识别。

这是个好问题,是的,能够不用指定,可是最好指定,若是你不指定,你调用这个方法只能经过People.jump,而不能经过 self.jump了,由于首参不是 self,而若是使用@staticmethod 就可使用self.jump。

因此说这是一个规范,就像类的私有方法,规范要求外部最好不要调用,但这不是强制要求,不是说外部就不能调用。

写这篇文章的起源,是前两天有位读者在交流里问到了相关的问题,正好没什么主题能够写,就拿过来作为素材整理一下,也正好没有写过静态方法、类方法的内容,没想到简单的东西,也能写出这么多的内容出来。

关注公众号,获取最新干货!
相关文章
相关标签/搜索