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

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

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

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

2、有了类/实例方法和普通函数,为什么还会有静态方法?

3、Python3.x 中,静态方法有几种写法?

带着这三个问题,你可以尝试在下文中寻找答案。



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

首先先来 Python2 的(以下在 Python2.7中测试通过)

可以得出结论:

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

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

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

4、实例方法(首参数为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中:

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

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

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

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

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

这是个好问题,是的,可以不用指定,但是最好指定,如果你不指定,你调用这个方法只能通过People.jump,而不能通过 self.jump了,因为首参不是 self,而如果使用@staticmethod 就可以使用self.jump。

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

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

原文地址:https://www.cnblogs.com/wongbingming/p/11140097.html

时间: 2024-08-29 19:04:32

Python静态方法,其实暗藏玄机的相关文章

python 静态方法、类方法(二)

<Python静态方法.类方法>一文中曾用在类之外生成函数的方式,来计算类的实例的个数.本文将探讨用静态方法和类方法来实现此功能. 一使用静态方法统计实例 例1.static.py # -*- coding:utf-8 -*- class Spam: numInstance = 0 def __init__(self): Spam.numInstance += 1 def printNumInstance(): print 'Number of instance:', Spam.numInst

Python 静态方法 类方法

静态方法和实例方法的区别主要体现在两个方面: 1. 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方式.也就是说,调用静态方法可以无需创建对象. 2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法:实例方法则无此限制. 3. 类方法可以被对象调用,也可以被实例调用:传入的都是类对象,主要用于工厂方法,具体的实现就交给子类处理 4. 静态

python静态方法类方法属性方法

Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数: 2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量: 3)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法. 静态方法 @staticmethod    def staticmd():        print '静态方法 @classmetho

Python 静态方法、类方法

今天我们来讨论一下Python类中所存在的特殊方法--静态方法.类方法. 一.定义 静态方法: 一种简单函数,符合以下要求: 1.嵌套在类中. 2.没有self参数. 特点: 1.类调用.实例调用,静态方法都不会接受自动的self参数. 2.会记录所有实例的信息,而不是为实例提供行为. 类方法: 一种函数,符合以下特征 1.类调用.或实例调用,传递的参数是一个类对象. 二.需要特殊方法的情况(用途) 程序需要处理与类而不是与实例相关的数据.也就是说这种数据信息通常存储在类自身上,不需要任何实例也

python 静态方法与类方法

#!/usr/bin/python #-*- coding: utf-8 -*- class Pizza(object):     a="AA"     def __init__(self):         self.name = 'leon'     def cook(self):         return self.mix_ingredients(self.cheese, self.vegetables)     @staticmethod     def mix_ingre

Python 静态方法和类方法的区别

python staticmethod and classmethod Though classmethod and staticmethod are quite similar, there's a slight difference in usage for both entities: classmethod must have a reference to a class object as the first parameter, whereas staticmethod can ha

python 静态方法、实例方法、类方法

实例方法: class A: data = 0 def printd(self): print(self.data) type(A) #out:type A.__dict__ #out: a = A() #out:{} 类方法:@classmethod class A: data = 0 def printd(self): print(self.data) def getdata(): A.data = 1 print(A.data) class A: data = 0 def printd(s

python静态方法-类方法

关于类的静态方法:@staticmethod 和 @classmethod 1.使用这两种方法,不用实例化类,直接可以用,如:Stu.say() 2.两种方法的区别: 1.@staticmethod 不需要加参数: 调用类变量用:类名.类变量名: 调用类函数用:类名.函数() 2.@classmethod 需要加参数cls: 调用类变量用:cls.类变量名: 调用类函数用:cls().函数() class Stu(object): country = 'china' # 类变量 def __in

python静态方法和类方法

静态方法是类和类的独立实例.它是在类范围中定义的方法. 它可以直接由类和实例被称为. 类方法和静态方法都要使用装饰器来定义,定义的基本格式是: @staticmethod def <function name>(): #do something 类方法定义的基本格式是: @ classmethod def <function name>(cls): #do something 类方法与成员方法不同的是,它须要传入參数cls,cls代表类. class Myclass(): x='c