您的位置:首页 > 编程语言 > Python开发

利用闭包把Python函数当类使

2010-08-11 10:13 507 查看
利用闭包可以实现把Python的函数当作类来使用的功能。

看一个简单的例子:

'''
Created
on 2010-8-10
@author:
Edward
Shen
shendl_s@hotmail.com
'''
def
User(params):



if(not
isinstance(params,type({}))):

raise
TypeError("params
must be dict!")


methods={}

def
getName():

return
params["name"]

methods["getName"]=getName

def
setName(newName):

params["name"]=newName

methods["setName"]=setName

def
dispatch(methodName):

method=
methods[methodName]

print
repr(method)

return
method

return
dispatch

if
__name__
==
'__main__':

user=User({"name":"shendl"})

print
user("getName")()

user("setName")("Edward")

print
user("getName")()

#print
user("name")()

#user2=User("shendl")

pass

说明:
1,利用Python支持函数闭包的特性实现了用函数当作类的功能。

2,局部变量
methods用于匹配所有公共函数。

3,User函数返回的也是一个函数—dispatch。它的作用是读取字符串参数,返回匹配的内部函数,或者抛出一个异常。

这里仅是示例,更好的方法是捕获异常后返回一个None给调用方。

4,dispatch返回的也是函数。用户再加上参数进行最终的调用。



上面的函数具备了Class的所有功能,除了继承。

但是继承实际上是OOP中最不重要的功能。我们可以使用一个变量,该变量是需要继承的类/函数的实例,然后通过它实现我们需要继承的函数即可。 忘了这在设计模式里叫什么了,反正设计模式里有这个技巧。

用函数模拟类的功能,可以在所有函数式编程语言中实现,包括Lisp,Erlang,甚至JavaScript也可以。但Ruby不行。Ruby的函数甚至都不是独立与类的。



我觉得,函数式编程的重要一项就是把数据和函数集中在一个函数而不是类中。 所有语言都需要模块化,不是吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: