阿里巴巴国际站客户经理,珍爱网征婚免费下载,网络平台的推广方法,搜索引擎推广的简称是分类目录#xff1a;《系统学习Python》总目录 文章《系统学习Python——类#xff08;class#xff09;#xff1a;静态方法#xff08;staticmethod#xff09;和类方法#xff08;classmethod#xff09;-[实例#xff1a;用静态方法计数]》中使用了静态方法对类生…分类目录《系统学习Python》总目录 文章《系统学习Python——类class静态方法staticmethod和类方法classmethod-[实例用静态方法计数]》中使用了静态方法对类生成的对象计数实际上类方法也可以实现类似的效果一一一如下代码与前面列出的静态方法版本具有相同的行为但是它使用一个类方法来把实例的类接收到其第一位参数中。类方法使用通用的自动传人类对象而不是硬编码类名称
class Spam:numInstances 0def __init__(self):Spam.numInstances Spam.numInstances 1def printNumInstances(cls):print(cls.numInstances)printNumInstances classmethod(printNumInstances)这个类与前面的版本使用方式相同但是通过类和实例调用printNumInstances方法的时候它接受的是spam类而不是实例
a Spam()
b Spam()
c Spam()a.printNumInstances()
Spam.printNumInstances()输出
3
3不过当使用类方法的时候别忘了它们接收调用的主体的最具体最底层的类。当试图通过传入类来更新类数据的时候这具有某些细微的隐藏含义。例如如果我们在模块中像前文那样通过子类化定制、扩展Spam.printNumInstances以同时显示其cls参数并且开始一个新的测试会话
class Sub(Spam):def printNumInstances(cls):print(SubSpam)Spam.printNumInstances()printNumInstances classmethod(printNumInstances)class Other(Spam):pass输出
SubSpam
2
SubSpam
2
2每当一个类方法运行的时候最底层的类都会被传人即便对于没有定义该方法自己版本的子类
a Sub()
b Spam()a.printNumInstances()
Sub.printNumInstances()
b.printNumInstances()输出
SubSpam
2
SubSpam
2
2这里的第一个调用通过Sub子类的一个实例进行了一次类方法的调用并且Python传人了最底层的类Sub给该类方法。在这个例子中由于该方法的Sub重定义版本显式地调用了Spam父类的版本Spam中的父类方法在第一位参数中接收自己。但是对于直接继承类方法的一个对象看看发生了什么
c Other()
c.printNumInstances()输出
3这里的最后一个调用把Other传递给了Spam的类方法。这在这个例子中也有效因为它通过继承获取了在Spam中找到的计数器。如果该方法试图赋值传人的类的数据那么它将更新Object而不是Spam在这个特定的例子中如果Spam通过直接编写自己的类名来更新其数据可能会更好而不是依赖于传人的类参数。
参考文献 [1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.