|
|
Class vs static methods in Python
这篇文章试图表明:什么是staticmethod/classmethod,而且这两者之间的差别.
staticmethod和classmethod均被作为装饰器,用作界说一个函数为”staticmethod”照旧”classmethod”
假如想要相识Python装饰器的底子,可以看 这篇文章(http://www.pythoncentral.io/python-decorators-overview/)
Simple, static and class methods
类中最常用到的方法是 实例方法(instance methods), 即,实例对象作为第一个参数通报给函数
比方,下面是一个根本的实例方法
[color=#800080 !important]class[color=#006FE0 !important] [color=teal !important]Kls[color=#333333 !important]([color=#800080 !important]object[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] [color=teal !important]def __init__[color=#333333 !important](self[color=#333333 !important],[color=#006FE0 !important] [color=#002D7A !important]data[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] self[color=#333333 !important].[color=#002D7A !important]data[color=#006FE0 !important] = [color=teal !important]data
[color=teal !important] def printd[color=#333333 !important](self[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] [color=teal !important]print[color=#333333 !important](self[color=#333333 !important].[color=#002D7A !important]data[color=#333333 !important])
[color=#002D7A !important]ik1[color=#006FE0 !important] = [color=teal !important]Kls[color=#333333 !important]([color=#DD1144 !important]'arun'[color=#333333 !important])
[color=#002D7A !important]ik2[color=#006FE0 !important] = [color=teal !important]Kls[color=#333333 !important]([color=#DD1144 !important]'seema'[color=#333333 !important])
[color=#002D7A !important]ik1[color=#333333 !important].[color=teal !important]printd[color=#333333 !important]()
[color=#002D7A !important]ik2[color=#333333 !important].[color=teal !important]printd[color=#333333 !important]()
得到的输出:
[color=teal !important]arun
[color=#002D7A !important]seema
调用关系图:
检察代码和图解:
[color=#009999 !important]1[color=#006FE0 !important]/[color=#009999 !important]2[color=#006FE0 !important] 参数通报给函数
[color=#009999 !important]3[color=#006FE0 !important] self参数指向实例自己[color=#006FE0 !important]
[color=#009999 !important]4[color=#006FE0 !important] 我们不必要显式提供实例,表明器自己会处置惩罚
如果我们想仅实现类之间交互而不是通过实例?我们可以在类之外创建一个简朴的函数来实现这个功能,但是将会使代码扩散到类之外,这个大概对将来代码维护带来题目。
比方:
[color=teal !important]def get_no_of_instances[color=#333333 !important]([color=#002D7A !important]cls_obj[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] return[color=#006FE0 !important] [color=#002D7A !important]cls_obj[color=#333333 !important].[color=teal !important]no_inst
[color=#800080 !important]class[color=#006FE0 !important] [color=teal !important]Kls[color=#333333 !important]([color=#800080 !important]object[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] [color=#002D7A !important]no_inst[color=#006FE0 !important] = [color=#009999 !important]0
[color=#006FE0 !important] [color=teal !important]def __init__[color=#333333 !important](self[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] [color=#002D7A !important]Kls[color=#333333 !important].[color=#002D7A !important]no_inst[color=#006FE0 !important] = [color=#002D7A !important]Kls[color=#333333 !important].[color=#002D7A !important]no_inst[color=#006FE0 !important] + [color=#009999 !important]1
[color=#002D7A !important]ik1[color=#006FE0 !important] = [color=teal !important]Kls[color=#333333 !important]()
[color=#002D7A !important]ik2[color=#006FE0 !important] = [color=teal !important]Kls[color=#333333 !important]()
[color=teal !important]print[color=#333333 !important]([color=teal !important]get_no_of_instances[color=#333333 !important]([color=#002D7A !important]Kls[color=#333333 !important]))
效果:
2
The Python @classmethod
如今我们要做的是在类里创建一个函数,这个函数参数是类对象而不是实例对象.
在上面谁人实现中,假如要实现不获取实例,必要修改如下:
[color=teal !important]def iget_no_of_instance[color=#333333 !important]([color=#002D7A !important]ins_obj[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] return[color=#006FE0 !important] [color=#002D7A !important]ins_obj[color=#333333 !important].[color=#002D7A !important]__class__[color=#333333 !important].[color=teal !important]no_inst
[color=#800080 !important]class[color=#006FE0 !important] [color=teal !important]Kls[color=#333333 !important]([color=#800080 !important]object[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] [color=#002D7A !important]no_inst[color=#006FE0 !important] = [color=#009999 !important]0
[color=#006FE0 !important] [color=teal !important]def __init__[color=#333333 !important](self[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] [color=#002D7A !important]Kls[color=#333333 !important].[color=#002D7A !important]no_inst[color=#006FE0 !important] = [color=#002D7A !important]Kls[color=#333333 !important].[color=#002D7A !important]no_inst[color=#006FE0 !important] + [color=#009999 !important]1
[color=#002D7A !important]ik1[color=#006FE0 !important] = [color=teal !important]Kls[color=#333333 !important]()
[color=#002D7A !important]ik2[color=#006FE0 !important] = [color=teal !important]Kls[color=#333333 !important]()
[color=teal !important]print iget_no_of_instance[color=#333333 !important]([color=#002D7A !important]ik1[color=#333333 !important])
效果
[color=#009999 !important]2
可以利用Python2.2引入的新特性,利用@classmethod在类代码中创建一个函数
[color=#800080 !important]class[color=#006FE0 !important] [color=teal !important]Kls[color=#333333 !important]([color=#800080 !important]object[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] [color=#002D7A !important]no_inst[color=#006FE0 !important] = [color=#009999 !important]0
[color=#006FE0 !important] [color=teal !important]def __init__[color=#333333 !important](self[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] [color=#002D7A !important]Kls[color=#333333 !important].[color=#002D7A !important]no_inst[color=#006FE0 !important] = [color=#002D7A !important]Kls[color=#333333 !important].[color=#002D7A !important]no_inst[color=#006FE0 !important] + [color=#009999 !important]1
[color=#006FE0 !important] [color=#333333 !important]@[color=teal !important]classmethod
[color=teal !important] def get_no_of_instance[color=#333333 !important]([color=#002D7A !important]cls_obj[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] return[color=#006FE0 !important] [color=#002D7A !important]cls_obj[color=#333333 !important].[color=teal !important]no_inst
[color=#002D7A !important]ik1[color=#006FE0 !important] = [color=teal !important]Kls[color=#333333 !important]()
[color=#002D7A !important]ik2[color=#006FE0 !important] = [color=teal !important]Kls[color=#333333 !important]()
[color=teal !important]print [color=#002D7A !important]ik1[color=#333333 !important].[color=teal !important]get_no_of_instance[color=#333333 !important]()
[color=teal !important]print [color=#002D7A !important]Kls[color=#333333 !important].[color=teal !important]get_no_of_instance[color=#333333 !important]()
We get the following output:
[color=#009999 !important]2
[color=#009999 !important]2
The Python @staticmethod
通常,有许多环境下一些函数与类相干,但不必要任何类或实例变量就可以实现一些功能.
好比设置情况变量,修改另一个类的属性等等.这种环境下,我们也可以利用一个函数,一样会将代码扩散到类之外(难以维护)
下面是一个例子:
[color=#002D7A !important]IND[color=#006FE0 !important] = [color=#DD1144 !important]'ON'
[color=teal !important]def checkind[color=#333333 !important]()[color=#006FE0 !important]:
[color=#006FE0 !important] return[color=#006FE0 !important] [color=#333333 !important]([color=#002D7A !important]IND[color=#006FE0 !important] == [color=#DD1144 !important]'ON'[color=#333333 !important])
[color=#800080 !important]class[color=#006FE0 !important] [color=teal !important]Kls[color=#333333 !important]([color=#800080 !important]object[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] [color=teal !important]def __init__[color=#333333 !important](self[color=#333333 !important],[color=#002D7A !important]data[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] self[color=#333333 !important].[color=#002D7A !important]data[color=#006FE0 !important] = [color=teal !important]data
[color=teal !important] def do_reset[color=#333333 !important](self[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] if[color=#006FE0 !important] [color=teal !important]checkind[color=#333333 !important]()[color=#006FE0 !important]:
[color=#006FE0 !important] [color=teal !important]print[color=#333333 !important]([color=#DD1144 !important]'Reset done for:'[color=#333333 !important],[color=#006FE0 !important] self[color=#333333 !important].[color=#002D7A !important]data[color=#333333 !important])
[color=#006FE0 !important] [color=teal !important]def set_db[color=#333333 !important](self[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] if[color=#006FE0 !important] [color=teal !important]checkind[color=#333333 !important]()[color=#006FE0 !important]:
[color=#006FE0 !important] self[color=#333333 !important].[color=#002D7A !important]db[color=#006FE0 !important] = [color=#DD1144 !important]'new db connection'
[color=#006FE0 !important] [color=teal !important]print[color=#333333 !important]([color=#DD1144 !important]'DB connection made for:'[color=#333333 !important],self[color=#333333 !important].[color=#002D7A !important]data[color=#333333 !important])
[color=#002D7A !important]ik1[color=#006FE0 !important] = [color=teal !important]Kls[color=#333333 !important]([color=#009999 !important]12[color=#333333 !important])
[color=#002D7A !important]ik1[color=#333333 !important].[color=teal !important]do_reset[color=#333333 !important]()
[color=#002D7A !important]ik1[color=#333333 !important].[color=teal !important]set_db[color=#333333 !important]()
效果:
[color=teal !important]Reset done for[color=#006FE0 !important]: [color=#009999 !important]12
[color=teal !important]DB connection made for[color=#006FE0 !important]: [color=#009999 !important]12
如今我们利用@staticmethod, 我们可以将全部代码放到类中
[color=#002D7A !important]IND[color=#006FE0 !important] = [color=#DD1144 !important]'ON'
[color=#800080 !important]class[color=#006FE0 !important] [color=teal !important]Kls[color=#333333 !important]([color=#800080 !important]object[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] [color=teal !important]def __init__[color=#333333 !important](self[color=#333333 !important],[color=#006FE0 !important] [color=#002D7A !important]data[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] self[color=#333333 !important].[color=#002D7A !important]data[color=#006FE0 !important] = data
[color=#006FE0 !important] [color=#333333 !important]@[color=teal !important]staticmethod
[color=teal !important] def checkind[color=#333333 !important]()[color=#006FE0 !important]:
[color=#006FE0 !important] return[color=#006FE0 !important] [color=#333333 !important]([color=#002D7A !important]IND[color=#006FE0 !important] == [color=#DD1144 !important]'ON'[color=#333333 !important])
[color=#006FE0 !important] [color=teal !important]def do_reset[color=#333333 !important](self[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] if[color=#006FE0 !important] self[color=#333333 !important].[color=teal !important]checkind[color=#333333 !important]()[color=#006FE0 !important]:
[color=#006FE0 !important] [color=teal !important]print[color=#333333 !important]([color=#DD1144 !important]'Reset done for:'[color=#333333 !important],[color=#006FE0 !important] self[color=#333333 !important].[color=#002D7A !important]data[color=#333333 !important])
[color=#006FE0 !important] [color=teal !important]def set_db[color=#333333 !important](self[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] if[color=#006FE0 !important] self[color=#333333 !important].[color=teal !important]checkind[color=#333333 !important]()[color=#006FE0 !important]:
[color=#006FE0 !important] self[color=#333333 !important].[color=#002D7A !important]db[color=#006FE0 !important] = [color=#DD1144 !important]'New db connection'
[color=#006FE0 !important] [color=teal !important]print[color=#333333 !important]([color=#DD1144 !important]'DB connection made for: '[color=#333333 !important],[color=#006FE0 !important] self[color=#333333 !important].[color=#002D7A !important]data[color=#333333 !important])
[color=#002D7A !important]ik1[color=#006FE0 !important] = [color=teal !important]Kls[color=#333333 !important]([color=#009999 !important]12[color=#333333 !important])
[color=#002D7A !important]ik1[color=#333333 !important].[color=teal !important]do_reset[color=#333333 !important]()
[color=#002D7A !important]ik1[color=#333333 !important].[color=teal !important]set_db[color=#333333 !important]()
得到的效果:
[color=teal !important]Reset done for[color=#006FE0 !important]: [color=#009999 !important]12
[color=teal !important]DB connection made for[color=#006FE0 !important]: [color=#009999 !important]12
How @staticmethod and @classmethod are different
[color=#800080 !important]class[color=#006FE0 !important] [color=teal !important]Kls[color=#333333 !important]([color=#800080 !important]object[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] [color=teal !important]def __init__[color=#333333 !important](self[color=#333333 !important],[color=#006FE0 !important] [color=#002D7A !important]data[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] self[color=#333333 !important].[color=#002D7A !important]data[color=#006FE0 !important] = [color=teal !important]data
[color=teal !important] def printd[color=#333333 !important](self[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] [color=teal !important]print[color=#333333 !important](self[color=#333333 !important].[color=#002D7A !important]data[color=#333333 !important])
[color=#006FE0 !important] [color=#333333 !important]@[color=teal !important]staticmethod
[color=teal !important] def smethod[color=#333333 !important]([color=#006FE0 !important]*[color=#002D7A !important]arg[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] [color=teal !important]print[color=#333333 !important]([color=#DD1144 !important]'Static:'[color=#333333 !important],[color=#006FE0 !important] [color=#002D7A !important]arg[color=#333333 !important])
[color=#006FE0 !important] [color=#333333 !important]@[color=teal !important]classmethod
[color=teal !important] def cmethod[color=#333333 !important]([color=#006FE0 !important]*[color=#002D7A !important]arg[color=#333333 !important])[color=#006FE0 !important]:
[color=#006FE0 !important] [color=teal !important]print[color=#333333 !important]([color=#DD1144 !important]'Class:'[color=#333333 !important],[color=#006FE0 !important] [color=#002D7A !important]arg[color=#333333 !important])
调用
[color=#006FE0 !important]>>> [color=#002D7A !important]ik[color=#006FE0 !important] = [color=teal !important]Kls[color=#333333 !important]([color=#009999 !important]23[color=#333333 !important])
[color=#006FE0 !important]>>> [color=#002D7A !important]ik[color=#333333 !important].[color=teal !important]printd[color=#333333 !important]()
[color=#009999 !important]23
[color=#006FE0 !important]>>> [color=#002D7A !important]ik[color=#333333 !important].[color=teal !important]smethod[color=#333333 !important]()
[color=#800080 !important]Static[color=#006FE0 !important]: [color=#333333 !important]()
[color=#006FE0 !important]>>> [color=#002D7A !important]ik[color=#333333 !important].[color=teal !important]cmethod[color=#333333 !important]()
[color=#800080 !important]Class[color=#006FE0 !important]: [color=#333333 !important](,)
[color=#006FE0 !important]>>> [color=#002D7A !important]Kls[color=#333333 !important].[color=teal !important]printd[color=#333333 !important]()
[color=#002D7A !important]TypeError[color=#006FE0 !important]: [color=teal !important]unbound method printd[color=#333333 !important]()[color=#006FE0 !important] [color=teal !important]must be called with Kls instance as[color=#006FE0 !important] [color=teal !important]first argument[color=#006FE0 !important] [color=#333333 !important]([color=teal !important]got nothing [color=#002D7A !important]instead[color=#333333 !important])
[color=#006FE0 !important]>>> [color=#002D7A !important]Kls[color=#333333 !important].[color=teal !important]smethod[color=#333333 !important]()
[color=#800080 !important]Static[color=#006FE0 !important]: [color=#333333 !important]()
[color=#006FE0 !important]>>> [color=#002D7A !important]Kls[color=#333333 !important].[color=teal !important]cmethod[color=#333333 !important]()
[color=#800080 !important]Class[color=#006FE0 !important]: [color=#333333 !important](,)
图解
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|