#!/usr/bin/env python
# -*- coding: utf-8 -*-
class TClassStatic(object):
def __init__(self, data):
self.data = data
def printself(*arg):
# for item in arg:
# print item.data
print("printself: ", arg)
@staticmethod
def smethod(*arg):
print("stattic: ", arg)
@classmethod
def cmethod(*arg):
print("class: ", arg)
def main():
obj = TClassStatic(10)
obj.printself()
obj.smethod()
obj.cmethod()
if __name__ == "__main__":
main()
通过三种函数的调用可以很清楚的看出,各种函数的默认参数,输出结果如下:
(‘printself: ‘, (<__main__.TClassStatic object at 0x6ffffe22910>,))
(‘stattic: ‘, ())
(‘class: ‘, (<class ‘__main__.TClassStatic‘>,))
1、普通函数,默认传入参数self,相当于C++中的this指针。解除printself中的注释,可以输出第一个参数的data就是对象的data(10)。这类函数的定义通常为def printself(self, *args, **kwargs)
,其特征是第一个参数为self,调用的时候只需传args,kwargs的值,实例对象.方法
2、@staticmethod修饰的函数,相当于C++中的类中静态函数,可以当做全局函数应用,默认不传入参数,调用方法:实例对象或类对象.方法
3、@classmethod修饰的函数,第一个参数cls默认是类名,调用方法:实例对象或类对象.方法
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class TClassStatic(object):
obj_num = 0
def __init__(self, data):
self.data = data
TClassStatic.obj_num += 1
def printself(self):
print("self.data: ", self.data)
@staticmethod
def smethod():
print("the number of obj is : ", TClassStatic.obj_num)
@classmethod
def cmethod(cls):
print("cmethod : ", cls.obj_num)
cls.smethod()
def main():
objA = TClassStatic(10)
objB = TClassStatic(12)
objB.printself()
objA.smethod()
objB.cmethod()
print("------------------------------")
TClassStatic.smethod()
TClassStatic.cmethod()
if __name__ == "__main__":
main()
输出结果如下:
(‘self.data: ‘, 12)
(‘the number of obj is : ‘, 2)
(‘cmethod : ‘, 2)
(‘the number of obj is : ‘, 2)
------------------------------
(‘the number of obj is : ‘, 2)
(‘cmethod : ‘, 2)
(‘the number of obj is : ‘, 2)
python中classmethod与staticmethod的差异及应用
原文地址:http://blog.csdn.net/callinglove/article/details/45689525