1.python是弱对象语言, 而ruby是纯对象语言
python可以没有对象运行,但是ruby的根基就是Object。
而且python对于封装的约束比较弱,而ruby相对较强。
比如一个class的实例dog。
python:dog.name = "dogy" 相当于给dog赋予了一个属性
ruby: dog.name = "dogy" 报错,dog没有name属性。
2.继承的实现不同
python的结构就是一个dictionary, 不论是class还是function,只要不是基本数据类型,内部的就够都是key,value形成的字典结构。函数是数据,也是函数。
比如:
class Dog():
name = "didi"
def spark(self):
print "i am a dog"
Dog.name 和 Dog.spark 都是数据,一个是字符串,一个是unbunded method。
如果在spark后加上(),就是call spark方法。
用dir(Dog)可以看到它的字典里有什么。
对于function也是一样的。 这和javascript很像。
class Cat(Dog):
pass
Cat继承了Dog内部整个的dict,Dog有的东西,Cat全有。
而ruby就不一样了
ruby根基就是Object。
Object中包括了属性,对象方法和实例方法。
这些东西都是区别对待的,而不是一股脑的都放到dict中去。
class不能直接调用实例方法,只能调用自己的方法(又称为静态方法)
而继承的时候,也只有实例方法被子类继承,父类自己的方法不被继承。
3.class 和module
python 和ruby中的module都是可以定义类和function。
但是ruby module可以被class include 进去,把function mixin进去。而python的module不能。
ruby的module也有instance method 和object method之分。
4.ruby是单继承, python是多继承
但是ruby的mixin功能实际上提供了多继承的实现。
5. python和ruby的metaprogramming也有一些不同
ruby对于class 的重复定义的处理是叠加,而python而是后定义的class冲掉前面的同名class。
而对于function的操作比较类似,可以定义新的function,和修改现有的function,从而实现AOP。
python aop 实现:
# usually , decrator is the tools to modify existing method
def trace(function):
def new(self, *tuple, **dict):
print "called here"
function(self)
return new
class Dog():
@trace
def spark(self):
print " I am qiang qiang! "
#actually, decrator is just a nice way to modify function.
#bwlow is the more understandable way to do it.
class Dog():
def spark(self):
print " I am qiang qiang! "
spark = trace(spark)
Dog().spark()
# or
# Dog.spark(Dog(), (), a = "a")
ruby AOP实现
require 'permission_filter'
class Dog
attr_accessor :errors
def spark word
return word
end
def validate_spark word
if word.size > 6
return "length too lone"
end
end
end
class Dog
include PermissionFilter
check_permission_of :spark, :validator => "validate_spark"
end
module PermissionFilter
def self.included base
base.extend PermissionMethods
end
end
module PermissionMethods
def check_permission_of action, args = {}
validator = args[:validator]
old_action = "old" + action.to_s
alias_method old_action.to_sym, action.to_sym
self.class_eval %Q{
def #{action} *args
error = self.send("#{validator}".to_sym, *args)
if error.nil?
self.send("#{old_action}".to_sym, *args)
else
self.errors ||= []
self.errors << error
end
end
}
end
end
#通过alias_method或者define_method来实现。
5.ruby的module和文件的名字没有关系.而python的module就是文件的名字(python2.5),folder就是package,还要求每一个pakcage下面要有一个__init__文件告诉python这是一个pakcage。
结论:ruby比python更加优雅,并且提供了不逊色于python的灵活性。
而python非常灵活,但是从OO的角度讲,灵活的有点过了。这些不能怪她,人家本来就不是纯OO的语言。应该说是纯module的语言。因为就算直接定义了一个方法, 该方法也是在__main__这个module中运行的。biult_in 方法存在于__biult-in__module中。
分享到:
- 2009-03-04 18:32
- 浏览 4055
- 评论(7)
- 论坛回复 / 浏览 (7 / 6277)
- 查看更多
相关推荐
Eric is a full featured Python and Ruby editor and IDE, written in python. It is based on the cross platform Qt gui toolkit, integrating the highly flexible Scintilla editor control. It is designed to...
使用Python Lua和Ruby语言进行游戏编程
Python、Ruby游戏设计参考图书,该书详细讲述了游戏的通用设计与如何用Python、Ruby等脚本类语言设计开发游戏。
Python和Ruby比较优缺点共1页.pdf.zip
python-ruby-golang click(Python),thor(Ruby)和cli.go(Golang)的比较,用于构建非常简单的命令行工具。 快速开始 有关更多信息,请参见每个子目录中的README.md。 博客文章
PHP、Python、Ruby的(数据库、文件)比较 (原创)
C++、Java、Python、Ruby和MATLAB OOP实例比较 红黑树二分搜索法示例,用于比较C++、Java、Python、Ruby和MATLAB代码 Comparison of C++, Java, Python, Ruby and MATLAB OOP Example RedBlack Tree Binary Search...
我应该学习Python还是Ruby? 乍一看,Python和Ruby似乎是非常相似的语言。 两者都是用于快速开发的高级语言。 两种语言都是优美的语言,如果编写得当,它们会很直观,并且读起来很像英语。 动态是什么意思? 好吧...
本文给大家对比了下python和Ruby的异同以及各自的优缺点等,向大家展示了python与Ruby的资源以及学习曲线,非常适合在此两种语言中犹豫不决的小伙伴,希望大家能够喜欢
为什么你一定要学习Python或Ruby语言.pdf
PyCall:从Ruby语言中调用Python函数该库提供了直接从Ruby语言中调用Python并与之进行部分互操作的功能。 您可以在PyCall中导入任意Python模块:从Ruby语言调用Python函数该库提供了直接从Ruby语言调用Python并与之...
NULL 博文链接:https://joyocaowei.iteye.com/blog/1440179
用Python,Lua和Ruby语言设计游戏,是python lua 和ruby的入门类书籍(英文版)
用Python,Lua和Ruby语言设计游戏-Game.Programming.with.Python.Lua.And.Ruby
PHP、Python、Ruby的(数据库、文件)比较(原创).pdf
带有水流和风的Gazebo无人水面车辆仿真_Python_Ruby_.zip
将教你如何使用游戏界中的三款主流脚本语言进行游戏编程。 从深层次阐述Python、Lua和Ruby这三种解释性脚本语言和用它们编写的游戏。