#代码说明 def aFunc_1(): pass class Myclass(object): a_arg = arg1 def __init__(sefl, *args, **kwargs): self.another_arg = args[] def afunc_2(self): print self.another_arg @classmethod def aFunc_3(cls): print "class method" @staticmethod def aFunc_4(): print "static method"
程序中涉及到
1)四个函数:aFunc_1(),aFunc_2(self), aFunc_3(cls), aFunc_4()
aFunc_1(): 普通函数(全局作用域)
aFunc_2(self):类函数(类作用域)
aFunc_3(cls):类成员方法函数(类作用域)
aFunc_4():类静态方法函数(类作用域)
2)两个属性:a_arg、self.another_arg
a_arg:类属性
self.another_arg:类实例属性
3)两个参数:(self)、(cls)
self:隐式传递对象参数
cls:隐式传递类参数
访问权限的区别:
函数类别 | 可否访问a_arg | 可否访问self.another_arg | 是否需要带self | 是否需要带cls |
aFunc_1() | NO | NO | NO | NO |
aFunc_2() | Yes | Yes | Yes | NO |
aFunc_3() | Yes | NO | NO | Yes |
aFunc_4() | NO | NO | NO | NO |
从表中可以看出:
1、类函数(可以访问所有类属性) > 类成员方法函数(只能访问类属性) > 类静态方法函数(在类作用域中的普通函数) > 普通函数(在类作用域外的普通函数)
2、classmethod和staticmethod的区别在于:classmethod有一个类参数(cls)
3、staticmethod和普通函数的区别在于:前者在类内部,普通函数在类外部