分类目录:《系统学习Python》总目录
相关文章:
· 静态方法(staticmethod)和类方法(classmethod):基础知识
· 静态方法(staticmethod)和类方法(classmethod):使用静态方法和类方法的原因
· 静态方法(staticmethod)和类方法(classmethod):初识Python中的静态方法
· 静态方法(staticmethod)和类方法(classmethod):静态方法备选方案
· 静态方法(staticmethod)和类方法(classmethod):使用静态方法和类方法
· 静态方法(staticmethod)和类方法(classmethod):用静态方法计数实例
· 静态方法(staticmethod)和类方法(classmethod):用类方法计数实例
· 静态方法(staticmethod)和类方法(classmethod):使用类方法统计每个类的实例个数实例
除了前面文章中提到的之外,目前还有另一个选择,可以编写和类相关联的、能通过类及其实例被调用的简单函数。从Python2.2起,我们可以编写带有静态方法和类方法的类,两者在调用时都不需要传人实例参数。为了指定这样的方法,类需要调用内置函数staticmethod
和classmethod
,就像之前的新式类讨论中提到的那样。它们都能将一个函数进行特殊标记。也就是说,静态方法不需要实例,类方法需要一个类参数。例如,下面的代码:
class Methods:
def imeth(self, x):
print([self, x])
def smeth(s):
print([x])
def cmeth(cls, x):
print([cls, x])
smeth = staticmethod(smeth)
cmeth = staticmethod(cmeth)
要注意程序代码中最后两个赋值语句只是重新赋值(也称为“重新绑定")了方法名称smeth
和cmeth
而已。在class
语句中,属性的建立和修改通过赋值语句进行,所以这些最后的赋值语句会覆盖稍早由def
所做的赋值。正如我们将在后面的文章看到的,特殊的@
语法可以作为这里的一种替代,跟它与property
的关系如出一辙。但是除非你理解了@
语法自动化背后的这种赋值形式,否则它很难被理解。
从技术上讲,Python现在支持带有不同参数协议的三种类相关方法:
- 实例方法:传人一个
self
实例对象(默认方式) - 静态方法:不传人额外的对象(通过
staticmethod
) - 类方法:传人一个类对象(通过
classmethod
,并在元类中是默认的)
此外,Python3.X也允许类中的简单函数只在通过一个类对象调用的时候充当静态方法的角色,而不需要额外的协议,从而扩展了这一模式。实例方法是我们在Python类中所见的常规也是默认的情况。一定要用实例对象调用实例方法。当你通过实例调用时,Python会把实例自动传给第一位(最左侧)参数;当你通过类调用时,需要手动传入实例:
obj = Methods()
obj.imeth(1)
Methods.imeth(obj, 2)
Methods.smeth(3)
obj.smeth(4)
Methods.cmeth(5)
obj.cmeth(6)
输出:
[<__main__.Methods object at 0x000001FBF2005820>, 1]
[<__main__.Methods object at 0x000001FBF2005820>, 2]
[3]
[4]
[<class '__main__.Methods'>, 5]
[<class '__main__.Methods'>, 6]
反之,静态方法调用时不需要实例参数。与编写在类外部的简单函数不同,其函数名是相应类的作用域的局部名称,而且可以通过继承查找。无实例函数通常在Python3.X中可以通过类调用,却在Python2.X中是完全不行的。使用staticmethod
内置方法还可以允许这样的方法在Python3.X中通过一个实例调用,而在Python2.X中同时可以通过类和实例调用(也就是说,前者在Python3.X中没有staticmethod
也能工作,但后者不可以)·。而类方法和静态方法类似,但Python自动把类(而不是实例)传人类方法第一位(最左侧〕参数中,不管它是通过一个类或一个实例调用。文章来源:https://www.toymoban.com/news/detail-822283.html
参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.文章来源地址https://www.toymoban.com/news/detail-822283.html
到了这里,关于系统学习Python——类(class):静态方法(staticmethod)和类方法(classmethod)-[使用静态方法和类方法]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!