Python变得更加面向对象了吗?

nop*_*ole 9 ruby python oop

我记得有一次,据说Python不像Ruby那样面向对象,因为在Ruby中,一切都是对象.Python也改变了吗?最新的Python是否比以前的版本更面向对象?

Bra*_*des 40

Jian Lin - 答案是"是",Python比Matz决定创建Ruby更加面向对象,现在这两种语言都以"一切都是对象"为特色.当Python更年轻时,"类型"(如字符串和数字)缺少方法,而"对象"是使用"类"语句(或故意在C扩展模块中构建类)构建的,并且效率稍低但是支持方法和继承.在20世纪90年代早期,当快速386是一台相当不错的机器时,这种妥协是有道理的.但是类型和类在Python 2.2(2001年发布)中统一,字符串得到了方法,在更新的Python版本中,用户甚至可以从它们中继承.

所以:Python当然不那么面向对象; 但是,据我所知,现在每一个旧的障碍都消失了.

以下是发生统一的指南:

http://www.python.org/download/releases/2.2/descrintro/

澄清:或许我可以更简单地说:在Python中,一切都是一个对象; 但是一些基本类型的对象(整数,字符串)曾经被"不同的规则"所阻止,这些规则阻止了OO编程方法(如继承)与它们一起使用.现在已经修复了.另一个响应中描述的len()方法可能是我希望Guido在升级到Python 3.0时改变的唯一方法.但至少他给了我字典理解,所以我不会抱怨太大声.:-)

  • @nemo,基本上他说len(x)保证返回一个int,而x.len()没有这样的保证.并且,他最初喜欢它看起来更好的方式.(找到电子邮件:http://mail.python.org/pipermail/python-dev/2008-January/076575.html http://mail.python.org/pipermail/python-dev/2008-January/076612. HTML) (6认同)
  • 哦,哇 关于为什么`len()`是一个函数而不是每个对象属性的一个非常好的**博客帖子:http://lucumr.pocoo.org/2011/7/9/python-and- POLA / (6认同)

Jas*_*ker 12

我不确定我是否认为Ruby比Python更面向对象.面向对象不仅仅是使用对象和点语法.我看到的一个常见论点是,在Python中获取列表的长度,你可以这样做:

len(some_list)
Run Code Online (Sandbox Code Playgroud)

我认为这是一个矛盾的论点.这真正转化为(几乎直接)是这样的:

some_list.__len__()
Run Code Online (Sandbox Code Playgroud)

这是完全面向对象的.我认为Rubyists可能会有点困惑,因为通常面向对象涉及使用点语法(例如object.method()).但是,如果我误解了Rubyists的论点,请随时告诉我.

无论面向对象如何,以这种方式使用len都有一个优点.有一两件事,总是让我生气的一些语言是有记忆是否使用some_list.size()some_list.length()some_list.len特定对象.Python的方式意味着只需记住一个功能

  • 抱歉.语法和OO彼此无关.Python对象可以具有非对象语法.它们仍然是物体. (9认同)
  • 面向对象包括语法和数据模型,但基于对象包括数据模型和可能的语法糖. (3认同)
  • @Ogre Psalm33 - 是的.如果覆盖对象的__len__方法,它将控制len函数获取的内容. (3认同)
  • 为什么不直接从列表中公开.len()呢?我认为你不能完全将OO设计与语法分开,因为语法在很大程度上定义了你的代码范例.some_list.len()是OO,因为您将列表视为一个对象,可以告诉您它的长度是多少.len(some_list)不是OO,无论它被翻译成什么. (2认同)
  • 请原谅我,我不是蟒蛇专家,但我没有看到真正的"面向对象"的讨论.在python中len(some_list)是多态的吗?我可以从该列表中继承并重写len方法吗?只是好奇. (2认同)

for*_*ran 7

虽然这不是一个恰当的答案......为什么你关心Python或多或少的OO?Python的酷炫之处在于它是pythonic,而不是面向对象或功能,或者是目前流行的范例!:-)

我学会了使用Java和面向对象进行编程,但是现在我没有给出任何关于它的信息,因为我知道OOP不是所有问题的解决方案(实际上,没有单一的范例).

看到: