Python进阶与拾遗6:Python中的静态方法与类方法
在Python工程中,静态方法与类方法是面向对象编程中常用的技术。本篇博文,向大家介绍Python中的静态方法与类方法,下面开始干货。
相关概念
- 当程序处理与类而不是实例相关的数据时,一个简单的函数就可以胜任,也不需要传递self参数。
- 静态方法是嵌套在一个类中的没有self参数的简单函数,并且旨在操作类属性而不是实例属性,静态方法不会接受一个自动的self参数。
- 类方法是类的一种方法,传递给它们的第一个参数是一个类对象而不是一个实例,不管是通过一个实例或者是一个类调用他们。
class Methods:
def imeth(self, x):
print(self, x)
def smeth(x):
print(x)
def cmeth(cls, x):
print(cls, x)
smeth = staticmethod(smeth)
cmeth = classmethod(cmeth)
def main():
obj = Methods()
obj.imeth(1)
Methods.imeth(obj, 2)
obj.smeth(3)
Methods.smeth(4)
obj.cmeth(5)
Methods.cmeth(6)
if __name__ == "__main__":
main()
'''
输出:
<__main__.Methods object at 0x000001E1CCD8E370> 1
<__main__.Methods object at 0x000001E1CCD8E370> 2
3
4
<class '__main__.Methods'> 5
<class '__main__.Methods'> 6
'''
使用静态方法与类方法的例子
- 使用静态方法统计实例个数。
class Spam:
numInstances = 0
def __init__(self):
Spam.numInstances += 1
def printNumInstances():
print("Number of instances:", Spam.numInstances)
printNumInstances = staticmethod(printNumInstances)
class Sub(Spam):
def printNumInstances():
print("Extra stuff...")
Spam.printNumInstances()
printNumInstances = staticmethod(printNumInstances)
def main():
a = Spam()
b = Spam()
c = Sub()
d = Sub()
a.printNumInstances()
b.printNumInstances()
c.printNumInstances()
d.printNumInstances()
Spam.printNumInstances()
Sub.printNumInstances()
if __name__ == "__main__":
main()
'''
输出:
Number of instances: 4
Number of instances: 4
Extra stuff...
Number of instances: 4
Extra stuff...
Number of instances: 4
Number of instances: 4
Extra stuff...
Number of instances: 4
'''
- 使用类方法统计实例的个数。
class Spam:
numInstances = 0
def __init__(self):
Spam.numInstances += 1
def printNumInstances(cls):
print("Number of instances:", cls.numInstances, cls)
printNumInstances = classmethod(printNumInstances)
class Sub(Spam):
def printNumInstances(cls):
print("Extra stuff...", cls)
Spam.printNumInstances()
printNumInstances = classmethod(printNumInstances)
def main():
a = Spam()
b = Spam()
c = Sub()
d = Sub()
a.printNumInstances()
b.printNumInstances()
c.printNumInstances()
d.printNumInstances()
Spam.printNumInstances()
Sub.printNumInstances()
if __name__ == "__main__":
main()
'''
输出:
Number of instances: 4 <class '__main__.Spam'>
Number of instances: 4 <class '__main__.Spam'>
Extra stuff... <class '__main__.Sub'>
Number of instances: 4 <class '__main__.Spam'>
Extra stuff... <class '__main__.Sub'>
Number of instances: 4 <class '__main__.Spam'>
Number of instances: 4 <class '__main__.Spam'>
Extra stuff... <class '__main__.Sub'>
Number of instances: 4 <class '__main__.Spam'>
'''
- 使用类方法,更能方便地处理层级中每个类不同的数据。
class Spam:
numInstances = 0
def count(cls):
cls.numInstances += 1
def __init__(self):
self.count()
count = classmethod(count)
class Sub(Spam):
numInstances = 0
def __init__(self):
Spam.__init__(self)
class Other(Spam):
numInstances = 0
def main():
a = Spam()
b = Spam()
c = Sub()
d = Sub()
e = Other()
f = Other()
print(a.numInstances)
print(b.numInstances)
print(c.numInstances)
print(d.numInstances)
print(e.numInstances)
print(f.numInstances)
print(Spam.numInstances)
print(Sub.numInstances)
print(Other.numInstances)
if __name__ == "__main__":
main()
'''
输出:
2
2
2
2
2
2
2
2
2
'''
以上,欢迎各位读者朋友提出意见或建议。
欢迎阅读笔者后续博客,各位读者朋友的支持与鼓励是我最大的动力!
written by jiong
嗟夫!予尝求古仁人之心,或异二者之为。何哉?
不以物喜,不以己悲;
居庙堂之高则忧其民;
处江湖之远则忧其君。