`
Lich_Ray
  • 浏览: 164185 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

尝试用Python实现消息传递编程风格

阅读更多
引用
本文站在一个难以名状的角度上研究了 Python 语言中消息发送的编程风格。原文是使用 JavaScript 描述的。文章作者 lichray 只把文章的上篇改成了 Python,因为下篇对于 Python 来说是没有意义的。lichray 是个 ECMAScript 的狂热追随者,mozilla.org 邮件列表里的无名潜水员。
文章中使用了 Python 解释器,行开头有 ">>>" 表示那是输入,输入下一行没有这个标记的表示解释器回馈消息。省略了多余的回馈。
PS: 文章用处不大。


[size=9]一. 对象和消息
考虑一下我们平常怎么说话的。我们叫某某人做某事,用下面的句式:
forest run!
其中"!"是语气的标志,对于编程语言来说是没有意义的,全部换成".":
forrest run.
不知道如果我告诉大家上面这句话就是 Smalltalk 语言中一个合法语句大家会怎么想。好了,不谈这个。这样我们就得到了一种语法,"宾"谓结构:
ObjectVerb::
	Object Verb.

如果让它支持多个 Verb,比如
forrest run, jump, stop.
可以扩展成这样:
ObjectVerb::
	Object VerbList.
VerbList::
	Verb
	Verb , VerbList

很明显,对于 Python 来说,上面的 BNF 不可能和任何一个产生式匹配。问题出在哪儿?我们要帮 Python 指定,谁是 Object,谁是 Verb。鉴于 Object 只有一个,Verb 有多个,我们可以用括号来区分它们,然后把最后那个句号去掉:
ObjectVerb::
	Object ( VerbList )

这样上面的那句话就变成了下面的形式:
forrest (run, jump, stop)
很像函数调用,是吧?不过还有一个问题,现在这些 Verb(s) 对于 Python 来说是“裸词”(Perl 语),我们可以避开再去定义这些标识符,用字符串代替;最后再说明一下 Object 是什么:
forrest ('run', 'jump', 'stop')
那么现在我们第一个“模仿”自然语言的程序版本出现了,加上下面针对 Python 的文法:
Object::
	Identifier
Verb::
	StringLiteral


二. 实现消息传递
有了文法,一切都好办。看得出来,我们下面的工作是定义能创建一个新 Object 的函数,函数中有一些动作,产生的新 Object 是一个能处理这些消息的函数。创建 Forrest Gump 的函数还可以创建 Tom,Mike 等等;他们都是 People:
def People ():
	def run ():
		print("I'm running!")
	
	def jump ():
		print("I'm jumping!")
	
	def stop ():
		print("I can't stop!")
		
	def _dispatch_ (verb):
		if verb == 'run': run()
		elif verb == 'jump': jump()
		elif verb == 'stop': stop()

	return _dispatch_


当然,我们可以用 lambda 和 eval() 替换显式的 _dispatch_ 函数。需要注意是,使用 eval() 要先保存上层执行环境:
def People ():
	def run ():
		print("I'm running!")
	
	def jump ():
		print("I'm jumping!")
	
	def stop ():
		print("I can't stop!")
		
	local = locals()
	return (lambda verb: eval(verb, globals() ,local)())


Ok。现在我们来试一试这个智商低于 85 的 Forrest Gump 怎么样:
>>> forrest = People()
>>> forrest('run')
I'm running!
>>> forrest('jump')
I'm jumping!
>>> forrest('stop')
I can't stop!
事情就是这样。我们成功地创造了对象,还让他做动作、说话。
不过,这个实现并不是我们上文中最后一个文法所指出的。它不支持连续发送指令。改一改。要加入顺序执行指令的办法:
def People ():
	def run ():
		print("I'm running!")
	
	def jump ():
		print("I'm jumping!")
	
	def stop ():
		print("I can't stop!")
	
	local = locals()
	return lambda *verblist: map((lambda verb: (eval(verb, globals(), local))()), verblist)


这下似乎比较像样了:
>>> forrest = People()
>>> forrest('jump','run','jump','stop')
I'm jumping!
I'm running!
I'm jumping!
I can't stop!

三. 利用消息传递处理状态
什么是状态?我们在进行面向对象编程时,把状态表示为对象的一组数据,我们称之为“属性(property)”。在我们的消息传递编程风格中,可以直接把这些数据堆到产生对象的那个函数中去。下面给 Forrest 加入一个状态,Forrest 口袋里的钱。先得声明原先有多少钱:
forrest = People(1000)
然后,我们希望可以执行这样的代码,让 forrest 支出 200 美元:
forrest('pay', 200)
但很明显,我们无法分清 200 是 Verb 还是 'pay' 所要求的数据。我们只得简化文法,只允许一次发送一个消息,以保全我们的脑细胞:
forrest('pay')(200)
也就是说,我们需要让 forrest('pay') 这一表达式返回一个能改变状态的函数,而不仅仅是调用函数来显示一句话。也就是说,如果我们想让 Forrest 急得跳起来,我们先得跳起来:
forrest('jump')()
新时代的 Forrest 实现如下(省略了一点多余的代码):
def People (money):
	local = locals()
	def pay (dollars):
		local['money'] = local['money'] - dollars
	
	def restMoney ():
		return local['money']
	
	def run ():
		print("I'm running!")
	
	local = locals()
	return lambda verb: eval(verb, globals(), local)


试一下。先支出 200 美元,然后看看他还剩多少钱:
>>> forrest=People(1000)
>>> forrest('restMoney')()
1000
>>> forrest('pay')(200)
>>> forrest('restMoney')()
800
当然,我们的 Forrest 还可以赚钱。下面这个版本比较彻底地说明了消息传递编程风格的一切。可以直接修改钱之后,我们可以不需要在创建 Object 的时候就说明原有多少钱;当然,使用注释中的版本更自然:
def People ():
	# def People (money):
	money = 0  # money = money or 0
	local = locals()
	def setMoney (dollars):
		local['money'] = dollars
	
	def addMoney (dollars):
		local['money'] = local['money'] + dollars
	
	def pay (dollars):
		local['money'] = local['money'] - dollars
	
	def restMoney ():
		return local['money']
	
	local = locals()
	return lambda verb: eval(verb, globals(), local)


试一下吧:
>>> forrest = People()
>>> forrest('addMoney')(1000)
>>> forrest('restMoney')()
1000
>>> forrest('pay')(200)
>>> forrest('restMoney')()
800

四. 小结
消息传递的编程风格指的是,把函数 A 的执行上下文当作对象的数据环境,在此定义对象的动词(函数),然后从此上下文中返回一个可以接受、处理消息的函数(常为匿名)。用函数 A 产生消息处理器作为对象,向此对象传递参数作为消息,以此执行函数 A 环境中定义的动作,这些动作还可能改变所在上下文中用一组数据定义的对象状态。
[/size]
分享到:
评论
33 楼 charon 2007-06-14  
Lich_Ray 写道

那么,你可以把这个想法和 Python 设计者说一下,因为他们给 Python 加的元类函数已经能和 JavaScript 的 prototype 的效果有一拼了,多添加的命名数量大约是是 20:3。你可以叫他们把这些东西去掉。

metaclass偶本来也觉得很不爽,因为它非常晦涩,而且关键是不知道用在什么地方。
不过,在看了一些文章和django的相关代码之后,我觉得这个玩意还是有点意思。简洁的说,这玩意不是给普通的应用开发者使用的,而是给框架设计者定制类的创建动作干活的,而这类定制创建动作的目的通常都是为了使使用者能够以更加简洁或者直观的方式来定义一些东西,或者时髦一点的说法,就是让使用者以更接近DSL的方式来干活。当然,因为括号的必须存在性,python的dsl美观程度比ruby差很多。而且,python的metaclass使用起来也比ruby的对应物要繁琐,虽然功能极其强大. 当然另外也可以在创建中参与内存管理,这个就太底层了,而且普通的方式也可以等效实现。
如果只是编写应用层面的代码(比如django的使用者),基本上不会碰到用到metaclass的场景.
从哲学上来说,这是一个小众特性。不了解不去用不会损害使用python的能力,滥用的话,对可读性和直观一致性都会有重大伤害。
不过它和javascript的prototype还是有很大不同的。它只在对象创建的时候干活(添加方法或者转换语义),对象创建之后,属性/方法的查找是不会搜索到metaclass的


引用

PS: 这里是公共论坛,你已经两次言论中过多歧视成分了吧。我初来时说话不好听,有人指出了,我改。

ok。我承认,我改。我是好同志.


引用

“包”就是 package。Python 中的 module 只能用 Dictionary 来显示而不能描述——所以设计者们正在考虑给 Python 加上 interface 呢!加了我也不用。

兄弟,python要加interface或者类似的东西不是因为这个原因吧。类似的东西在Zope,twisted,Peak中都已经作为应用级的协议出现了。而且类似的pep以及各种建议都被否决了n次了。
而且,这方面的议论和建议五花八门,貌似各路大佬都出来说过话。但是没听人说是因为描述module的能力不够强,所以要引入interface.而且,在我看来,所以不需要类型声明的语言(通常动态语言都这样),这方面的描述能力都是脚碰脚.

引用

一种语言(包括 OO 机制)想要强大,前提是全面,全面的前提是自足。不能以其本身自我满足的语言,关键字越多,语言越弱。

这个有关系,但关系也不大吧。一个语言通常会提供一个最小核心,比如循环语句只需要一种,条件判断也不需要那么复杂。但是,通常为了使用者的便利性或者习惯,又会提供别的一些东西。
关键是在引入新特性的同时能够在语义模型这一层把饼画圆了.这一点,python作的算是不错的了,引入新特性时非常的谨慎,而且语言的进化基本上没拿关键字说话(好像只有2.5多了个with吧,as只能算半个)。个人认为作为一种大众语言,进化是没有办法的事情,只能说是采用什么样的方式来面对了.
32 楼 Lich_Ray 2007-06-14  
charon 写道
兄弟,说的是OO机制上的强弱。不是说今天你穿了件红衣服,他穿了件绿衣服,红衣服就比绿衣服强很多。而且红衣服上有个脏东西,绿衣服上没有,难道是绿衣服的错?

那么,你可以把这个想法和 Python 设计者说一下,因为他们给 Python 加的元类函数已经能和 JavaScript 的 prototype 的效果有一拼了,多添加的命名数量大约是是 20:3。你可以叫他们把这些东西去掉。PS: 这里是公共论坛,你已经两次言论中过多歧视成分了吧。我初来时说话不好听,有人指出了,我改。
现在觉得 Python 的 lambda 岂一个失败了得,值得好好改改。
还是那句话,Python 的哲学是“实用主义”,我其实是很喜欢 Python 的,它不能这样不能那样是有一定道理的,我可以理解。

最后这个我要解释一下:
引用
8. N/A. 不了解这个包的含义. 但是,有个疑问,一个语言的某个内置数据类型是否具备某个特性,能够上升到这个语言的OO机制是否够强的高度?

“包”就是 package。Python 中的 module 只能用 Dictionary 来显示而不能描述——所以设计者们正在考虑给 Python 加上 interface 呢!加了我也不用。一种语言(包括 OO 机制)想要强大,前提是全面,全面的前提是自足。不能以其本身自我满足的语言,关键字越多,语言越弱。

关于 JavaScript 库的问题不再这儿多回复一遍。
31 楼 sp42 2007-06-14  
博客上好东西不少呀
谢谢LZ,还是那句~好样的!
30 楼 sp42 2007-06-14  
引用
在我的博客 http://let-in.blogspot.com 上可以找到,但现在貌似上不去,服务器维护。
我写的关于 JavaScript 实现OOP的文章终于完工了:
http://lichray.iteye.com/blog/89554
对无类语言有点兴趣的可以去看看。


是的 好像整个blogspot.com被封掉了
搞了一个代理上~ok
29 楼 charon 2007-06-13  
Lich_Ray 写道
如果那些写 js 包的人是完全在使用 JavaScript 本身的设施(尤其是 prototype)在达到目的,每个新 OOP 特性的代码应该在 5 行之类解决问题。而这些让我很不爽的人是怎么做的呢?当然会不兼容了。只要思路是一致的,用什么命名一点也不重要!


看看这个链接:http://ajaxpatterns.org/Javascript_Inheritance
它条分缕析的说明javascript实现继承的各种途径的优劣。
说句实话,用javascript写程序的那帮家伙,哪一个不是完全在使用 JavaScript 本身的设施? 难道他们还用到了javascript之外的设施不成?
28 楼 charon 2007-06-13  
Lich_Ray 写道

Python 的类能是匿名的吗?
Python 的单个实例能 Mixin 吗?
Python 的类能在声明完成之后不声明额外名字给类添加方法吗?
Python 的对象能在声明完成之后不声明额外名字给自己添加方法吗?
Python 的类能继承某个实例的能力吗?
Python 的对象能继承另一个对象的能力吗?
Python 的类能真正支持私有属性吗?
Python 能用 Dictionary 完全描述一个包吗?

兄弟,说的是OO机制上的强弱。不是说今天你穿了件红衣服,他穿了件绿衣服,红衣服就比绿衣服强很多。而且红衣服上有个脏东西,绿衣服上没有,难道是绿衣服的错?
Python是一个基于Class的语言,问题2,5,6基本没有意义.
1.没有
2.这个问题没有意义,多继承和基于类的mixin基本等价。而python中的对象都有其class/type. 本身OO的哲学就不提倡基于实例的mixin,在实例上都mixin其它的东西了,还能当同一个类的实例用?
3.这个和OO没关系,如果你的方法能够用lambda表述,python就能支持在类的声明完成后不声明额外名字添加方法。如果不能,就做不到。这个,只能说python的匿名函数机制不够强悍,和OO无关.
4. 类似于3. 但是有一个区别. python是基于类的语言,对象是不需要声明的,只有初始化。
5. 再次确认python是基于Class的语言,某个实例必然存在相应的Class/Type,不存在类继承某个实例的必要性。
6. 同上. 对象a要继承对象b的能力,就让Class A继承Class B. 从OO的原则上来说,对象的行为应当由其Class定义,而不是说自己动态搞出一堆东西来。
7. 不能。这个是沿袭自C/C++/Java的哲学问题。python给了一个约束,但是你要刻意打破这个约束,它给你这个自由。而且,不要以为python中使用不了逃逸法,也是很easy的事情,在行数上也不会增加什么东西
8. N/A. 不了解这个的含义. 但是,有个疑问,一个语言的某个内置数据类型是否具备某个特性,能够上升到这个语言的OO机制是否够强的高度?
27 楼 Lich_Ray 2007-06-13  
如果那些写 js 包的人是完全在使用 JavaScript 本身的设施(尤其是 prototype)在达到目的,每个新 OOP 特性的代码应该在 5 行之类解决问题。而这些让我很不爽的人是怎么做的呢?当然会不兼容了。只要思路是一致的,用什么命名一点也不重要!
引用
你一再确认的python在OO机制上弱于javascript/lua的说法的根据,我一直没看到。只看到你在不停的例举javascript如何强大,但至少在你举出的这些方面,javascript没比python强。

我说,我说。
Python 的类能是匿名的吗?
Python 的单个实例能 Mixin 吗?
Python 的类能在声明完成之后不声明额外名字给类添加方法吗?
Python 的对象能在声明完成之后不声明额外名字给自己添加方法吗?
Python 的类能继承某个实例的能力吗?
Python 的对象能继承另一个对象的能力吗?
Python 的类能真正支持私有属性吗?
Python 能用 Dictionary 完全描述一个包吗?
也许我真的对 Python 不太了解吧。我只知道,JavaScript 实现这些,每个特性只需要 0~3 行代码;不知道 Python 要几行——或者,咱们再加点儿关键字?able, workas, like, private, can, to,都不错。哦,我差点儿忘了,已经加了不少元类函数了!
我想说的是,机制是抽象的,策略是具体的。没有优秀的机制,处处碰壁。

引用
给我的感觉,你想说明的是基于prototype的无类OO语言很强大,至少在整体上说不弱于基于class的OO语言。但是为了表达的更具震撼性,就变成整体上要强大,而且是很多了。

这个想法相当有意思。你的意思是说,我为了说 JavaScript 好,故意说 Python 的不是?Python 不是被设计用来显示设计者牛X的,它的哲学是“实用主义”(这一点你应该比我清楚),所以不用太苛求。更何况,对于无类语言而言,山外青山楼外楼,无类语言未尝休,只怕,又是一块“新大陆”。

PS: 不错,发了3篇博客我成二星会员啦!累死了,明天起开始潜水。
26 楼 charon 2007-06-13  
Lich_Ray 写道

什么叫“直观和一致性”?如果要谈面向对象,模式多呢(我写的文章中还只是覆盖了一小部分),加再多关键字也不够用啊,不觉得没有“直观和一致性”吗?


我之前的帖子其实是个坑,让你用基于object的模式去干基于class的模式所擅长的部分。基于class的语言对继承/多态等特性提供了直接的机制,而javascript就像你在另一个主贴里面写的那样,需要自己定义Object的prototype的extend/mixin等来搞定。这个就是所谓的不一致的来源,每个人都可以定义自己的extend/mixin,,甚至连命名都不一样,很多开源包都或多或少定义了类似的东西,但是语义上都存在一些或大或小甚至微妙的差异。因为这种情况的存在,直观就更谈不上了,因为面对不同的实现,使用者的直觉总会有差异的时候。

从这一点来看,这个挖坑的做法确实不是很厚道。但是,你在这个帖子里面的说法其实也不厚道,所以也就是彼此彼此而已。你一再确认的python在OO机制上弱于javascript/lua的说法的根据,我一直没看到。只看到你在不停的例举javascript如何强大,但至少在你举出的这些方面,javascript没比python强。给我的感觉,你想说明的是基于prototype的无类OO语言很强大,至少在整体上说不弱于基于class的OO语言。但是为了表达的更具震撼性,就变成整体上要强大,而且是很多了.
25 楼 radar 2007-06-12  
Lich_Ray 写道

JavaScript 2?几乎是不可能的。看看现在的 JS 1.6、1.7 中新加入的函数式编程要素(List 访问函数和 let)就知道当下 JavaScript 的发展方向了。

我觉得javascript引入package,class等本意是为了吸引更多的 java,c#,等web开发者。并不是js语言本身缺乏这些支持。可能很多人不习惯,但这对于语言长远来看,有好处的。


但近来 动态类型语言 的异军突起,javascript可以借这东风了。反而我觉得 prototype.js,dojo 显得javascritp更应该改变了。
24 楼 radar 2007-06-12  
charon 写道
Lich_Ray 写道
...
我不装牛X。我会发文说明怎么用 JavaScript/Lua 以非常优美的方式实现继承、多继承、Mixin、4P、多态等等一篮子特性的。JavaScript 那么谦虚,你们就因此找它的碴?
.....

其实不是我在找"javascript的碴"。怎么看都是你在找python的碴啊。
就我个人的体验,写javascript程序到后来,不是自己写一些趁手的lib,就是最终去用那些处于快速变化过程中的开源包。和写java/python程序相比,是一个相对痛苦的过程。
不过,说句公道话,这个痛苦倒不是来自于javascript语言本身,一者是因为javascript通常都是处理ui层的event驱动逻辑,而ui本身就是一个痛苦的过程。二者是javascript的浏览器环境的限制,不可能像一般的c/s客户端那样有成熟的ide来支持。
从语言使用者的层面,相对于python,象javascript这样的基于prototype的语言,不论用那种方式实现继承/多继承/多态等等特性,都不会象基于class的语言那样来的直观和一致性。我想这也是javascript2在语言层面提供class,interface,extend,package等特性的原因之一。一旦引入了这些东西,在内部机制的梳理上又会有很有意思的变化。比如python,现在的这种相对符合直观的MRO方式,也是在2.3之后才稳定下来.

在这支持一下charon, 说明支持点:

其实各种语言有他们发挥最佳优势的环境。这些很多是历史造成了,就说javascript,让恶心的浏览器不兼容影响了。

希望讨论时,都从语言本身来聊,最好搞代码擂台之类的。
23 楼 Lich_Ray 2007-06-12  
在我的博客 http://let-in.blogspot.com 上可以找到,但现在貌似上不去,服务器维护。
我写的关于 JavaScript 实现OOP的文章终于完工了:
http://lichray.iteye.com/blog/89554
对无类语言有点兴趣的可以去看看。

引用
相对于python,象javascript这样的基于prototype的语言,不论用那种方式实现继承/多继承/多态等等特性,都不会象基于class的语言那样来的直观和一致性

什么叫“直观和一致性”?如果要谈面向对象,模式多呢(我写的文章中还只是覆盖了一小部分),加再多关键字也不够用啊,不觉得没有“直观和一致性”吗?
JavaScript 2?几乎是不可能的。看看现在的 JS 1.6、1.7 中新加入的函数式编程要素(List 访问函数和 let)就知道当下 JavaScript 的发展方向了。
22 楼 sp42 2007-06-12  
请问问Lich_Ray原文的(JS)在哪可以找到
21 楼 sp42 2007-06-12  
引用
就我个人的体验,写javascript程序到后来,不是自己写一些趁手的lib,就是最终去用那些处于快速变化过程中的开源包。和写java/python程序相比,是一个相对痛苦的过程。
不过,说句公道话,这个痛苦倒不是来自于javascript语言本身,一者是因为javascript通常都是处理ui层的event驱动逻辑,而ui本身就是一个痛苦的过程。


以前写JS UI是很痛苦的,-这一点也没没错,但在EXT到来之后。。一切都变得那么优美。。。
20 楼 sp42 2007-06-12  
是的,javascript的强项就是做UI,这是从它发明之初就确定的了
偶然的情况下,遇到一大堆prototype语言的论文,发现一个有趣的分类
19 楼 charon 2007-06-12  
Lich_Ray 写道
...
我不装牛X。我会发文说明怎么用 JavaScript/Lua 以非常优美的方式实现继承、多继承、Mixin、4P、多态等等一篮子特性的。JavaScript 那么谦虚,你们就因此找它的碴?
.....

其实不是我在找"javascript的碴"。怎么看都是你在找python的碴啊。
就我个人的体验,写javascript程序到后来,不是自己写一些趁手的lib,就是最终去用那些处于快速变化过程中的开源包。和写java/python程序相比,是一个相对痛苦的过程。
不过,说句公道话,这个痛苦倒不是来自于javascript语言本身,一者是因为javascript通常都是处理ui层的event驱动逻辑,而ui本身就是一个痛苦的过程。二者是javascript的浏览器环境的限制,不可能像一般的c/s客户端那样有成熟的ide来支持。
从语言使用者的层面,相对于python,象javascript这样的基于prototype的语言,不论用那种方式实现继承/多继承/多态等等特性,都不会象基于class的语言那样来的直观和一致性。我想这也是javascript2在语言层面提供class,interface,extend,package等特性的原因之一。一旦引入了这些东西,在内部机制的梳理上又会有很有意思的变化。比如python,现在的这种相对符合直观的MRO方式,也是在2.3之后才稳定下来.
18 楼 Lich_Ray 2007-06-12  
说实在的,我对这样的讨论深感失望。我确实写过百行以上级的 JavaScript 代码,两个加起来,除去注释大概有 1400 行吧。我是把 JavaScript 当作实用版的 Scheme 来用的人,不爱搞网页。
什么叫“发现新大陆”?新大陆本来就存在,只不过一些人总怕别人发现了新大陆罢了。
我不装牛X。我会发文说明怎么用 JavaScript/Lua 以非常优美的方式实现继承、多继承、Mixin、4P、多态等等一篮子特性的。JavaScript 那么谦虚,你们就因此找它的碴?

PS: 我不是“搞技术”的。我是个学习算法和编译原理的“妖怪”。
17 楼 charon 2007-06-12  
dogstar 写道
charon有些过分了,每种语言都有自己的使用范围,而且何以见得“最简单的,就拿我前面的帖子说的,用javascript/lua实现一个继承+重载的最简单的OO例子。如果还有能耐,可以再加一个多继承或者mixins的。然后对比一下python/ruby的实现。 ”这些是oo的必备要素呢?我觉得Lich_Ray写的另外一个帖子"00的进化"正是佐证了oo的分类。oo不是一个绝对的概念。要广纳之。

不过Lich_Ray兄,开始说的话确实容易激起公愤的。做人要谦虚,人外有人,天外有天。有掐架的时间,多介绍一下FP方面的东西岂不是更好?


hehe. 其实我也不确定继承 + 多态是不是OO的基本要素。
OO分类10多年前就有"基于对象"和"基于类"的说法,我不反对现在再来吵这两个哪个更加OO一些这类问题,但是有必要吗把这个事情搞得好像发现新大陆一样吗?大家好歹都算是搞技术的,别整得那么浮躁不行啊.
16 楼 dogstar 2007-06-12  
charon有些过分了,每种语言都有自己的使用范围,而且何以见得“最简单的,就拿我前面的帖子说的,用javascript/lua实现一个继承+重载的最简单的OO例子。如果还有能耐,可以再加一个多继承或者mixins的。然后对比一下python/ruby的实现。 ”这些是oo的必备要素呢?我觉得Lich_Ray写的另外一个帖子"00的进化"正是佐证了oo的分类。oo不是一个绝对的概念。要广纳之。

不过Lich_Ray兄,开始说的话确实容易激起公愤的。做人要谦虚,人外有人,天外有天。有掐架的时间,多介绍一下FP方面的东西岂不是更好?
15 楼 charon 2007-06-12  
Lich_Ray 写道
看完我写的这篇文章,LS 可以接着教训我,如果你还有话说道话。
http://lichray.iteye.com/admin/show/89241

兄弟,把某些语言的历史沿革说道说道,然后夹杂一些自己也不明所以的私货,就好意思舔着脸装牛X了?
引用
PS: 如果你对 JavaScript 还是十分不屑可以来请教我啊。

hehe,你如果真的想了解javascript,那就拿它去写一些以百行为数量级的代码,然后再回来说话。深入的了解不是靠着写hello world程序写出来的。
最简单的,就拿我前面的帖子说的,用javascript/lua实现一个继承+重载的最简单的OO例子。如果还有能耐,可以再加一个多继承或者mixins的。然后对比一下python/ruby的实现。
当然,你也可以告诉我继承和重载不在你的所谓的OO的雷达屏幕上。然后再牛X烘烘的新开一个帖子论述一下这个问题。



14 楼 Lich_Ray 2007-06-11  
看完我写的这篇文章,LS 可以接着教训我,如果你还有话说道话。
http://lichray.iteye.com/admin/show/89241
PS: 如果你对 JavaScript 还是十分不屑可以来请教我啊。

相关推荐

    python二级课后题编程答案

    10. **函数式编程**:使用map()、filter()、reduce()等函数,以及lambda表达式和列表推导式实现函数式编程风格。 每个编程题目都会围绕以上一个或多个知识点进行设计,通过解答这些题目,学生可以巩固理论知识,...

    Python-CNNsRNNsGANs等实现

    在IT领域,特别是机器学习和深度学习中,Python语言凭借其强大的库支持和易读性,成为了首选的编程工具。本资源"Python-CNNsRNNsGANs等实现"聚焦于三种重要的深度学习模型:卷积神经网络(Convolutional Neural ...

    python撩妹

    Python是一种强大的编程语言,不仅在科学计算、数据分析、人工智能等领域有着广泛应用,还能用来做一些创意十足、有趣的事情...所以,不妨尝试用Python来“撩妹”,让编程成为连接感情的桥梁,展现出科技的温情与魅力。

    27篇精选python文章

    这意味着可以将类的实例作为参数传递给其他函数,或用于函数式编程风格。 ### Python学习路径 对于没有编程经验的学习者,建议从基础语法开始,逐步掌握数据结构、控制流、函数和模块等内容,然后再深入到面向对象...

    蓝桥杯青少年创意编程Python组赛前集训教程包,蓝桥杯青少年创意编程python初级考察内容,Python源码.zip

    蓝桥杯提供的源码可以帮助学生了解其他选手的解题思路和编程风格,从而提升自己的编程水平。 综上所述,这个集训教程包涵盖了Python编程的多个方面,包括基础语法、数据结构、控制流、文件操作、函数式编程、面向...

    python bug清除手册-代码书写规范与基本使用.pdf

    根据PEP 8(Python Enhancement Proposal 8)—— Python官方的代码风格指南,建议在赋值操作符`=`的两边各添加一个空格来提高代码的可读性。例如: ```python a = 0 b = input('输入你的问题') ``` 这种写法虽然...

    Python3.6零基础入门与实战-code.rar

    【Python3.6零基础入门与实战】 Python 3.6是Python编程语言的一个重要版本,以其简洁明了的语法和强大的功能深受程序员...记得动手实践,因为编程学习最好的老师就是亲自动手尝试。祝你在Python的世界里探索愉快!

    从零开始的python教程自学方法

    它支持面向对象、函数式和过程式编程风格。Python的标准库非常丰富,提供了大量内置函数和模块,用于各种任务。 二、安装Python环境 首先,你需要下载并安装Python解释器。访问Python官方网站...

    Python 自学20个专题总结

    良好的编程习惯包括避免多余空格,正确判断`None`,合理使用`lambda`表达式,减少受保护代码,保持逻辑完整性,使用意义明确的方法,采用EAFP(尝试-错误-处理)或LBYL(看-再开火)防御编程风格,考虑异常处理,...

    Python web框架.Flask中文手册.pdf

    - **消息系统**:解释了Flask的消息闪烁功能,即如何在不同的请求之间传递临时信息。 - **应用场景**:探讨了这一功能在实际开发中的应用,如提示用户操作结果等。 **3.10 日志记录** - **日志模块**:介绍了Flask...

    完整图文版教程 优质的Python基础入门教程 讲解清晰 PPT课件 11、Python函数总结 (共36页).rar

    Python支持函数式编程风格,如高阶函数(函数作为参数传递)、map()、filter()、reduce()等,以及列表推导式、生成器等特性。 13. **上下文管理器**: 通过定义`__enter__`和`__exit__`方法,可以创建上下文管理...

    Python-CNNRNN以及深入学习新酷技术的实现

    Python作为目前最流行的编程语言之一,为这些复杂的算法提供了便利的实现框架,如TensorFlow、Keras和PyTorch。 **CNN(卷积神经网络)**是一种专门用于处理具有网格结构数据的神经网络,如图像和声音。CNN的核心...

    google-python-exercises.zip_google_gray1oq_solutions

    **Python编程基础与Google实践教程** 本压缩包“google-python-exercises.zip_google_gray1oq_solutions”包含了一份由Google提供的Python入门教程,旨在帮助初学者掌握Python编程的基础知识。这个教程不仅涵盖了...

    爱心代码合集(html、C语言、Python)

    《爱心代码合集:HTML、C语言与Python的浪漫编程》 爱心,这个象征着温暖与关怀的符号,被巧妙地融入到了编程的世界中。在本"爱心代码合集"中,...这是一次技术与情感的完美碰撞,用代码传递温暖,用编程表达爱意。

    合肥师范学院Python期末考试.docx

    选项B使用了C/C++风格的三目运算符,Python不支持。选项C是Python的条件表达式写法,是正确的。选项D使用了`true`,Python中应使用`True`。 11. **编码解码**:Python的`str`对象可以使用`encode()`方法编码成字节...

    Python库 | ReactiPy-0.0.93.tar.gz

    3. **声明式编程**:ReactiPy鼓励声明式编程风格,开发者只需要描述UI应有的状态,而库会自动处理如何更新UI以反映这些变化。 4. **状态管理**:ReactiPy可能提供了类似于React的state和props机制,用于管理组件的...

    合肥师范学院Python期末考试.pdf

    这些知识点涵盖了Python的基础语法,包括变量命名、数据类型、字符串操作、文件操作、循环结构、函数使用、面向对象编程、错误处理和版本兼容性等方面。掌握这些知识点对于学习和理解Python编程至关重要。

    深入Python函数编程的一些特性

    Python是一种高度支持函数式编程风格的动态类型语言,它允许开发者利用函数作为一等公民,即函数可以作为变量赋值、作为参数传递以及作为返回值。在Python中,函数编程提供了一种强大的抽象层次,使得代码更加模块化...

    python如何写try语句

    Python中的`try`语句是异常处理的关键构造,它允许你在程序中捕获和处理可能出现的错误或异常,从而提高程序的健壮性。...在实际编程中,确保理解每种风格的用途,并根据需要选择合适的异常处理策略。

Global site tag (gtag.js) - Google Analytics