利用闭包把python函数当类使...
时间:2010-08-10 来源:shendl
利用闭包可以实现把Python的函数当作类来使用的功能。
看一个简单的例子:
'''
Created on 2010-8-10
@author: Edward Shen [email protected]
'''
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的函数甚至都不是独立与类的。
我觉得,函数式编程的重要一项就是把数据和函数集中在一个函数而不是类中。 所有语言都需要模块化,不是吗?