系统学习Python——类(class):静态方法(staticmethod)和类方法(classmethod)-[使用静态方法和类方法]

发布时间:2024年01月24日

分类目录:《系统学习Python》总目录


除了前面文章中提到的之外,目前还有另一个选择,可以编写和类相关联的、能通过类及其实例被调用的简单函数。从Python2.2起,我们可以编写带有静态方法和类方法的类,两者在调用时都不需要传人实例参数。为了指定这样的方法,类需要调用内置函数staticmethodclassmethod,就像之前的新式类讨论中提到的那样。它们都能将一个函数进行特殊标记。也就是说,静态方法不需要实例,类方法需要一个类参数。例如,下面的代码:

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)

要注意程序代码中最后两个赋值语句只是重新赋值(也称为“重新绑定")了方法名称smethcmeth而已。在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自动把类(而不是实例)传人类方法第一位(最左侧〕参数中,不管它是通过一个类或一个实例调用。

参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.

文章来源:https://blog.csdn.net/hy592070616/article/details/135829481
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。