可爱的 Python: Python 之优雅与瑕疵,第 2 部分
2008-09-30 12:58:25 来源:WEB开发网本系列 第一期文章 讨论了序列和比较。本期文章将以这些主题为基础展开讨论。
在大多数面向对象语言中,方法和属性几乎相同(但并非完全相同)。两者都可以附加到类和/或实例。除了实现细节外,存在一个关键区别:当附加到对象时,您可以调用 方法 发起动作和计算;而属性 仅具有一些可被检索(或者修改)的值。
对于某些语言(例如 Java™ 语言),这可能是惟一的区别。属性和方法之间泾渭分明。Java 语言通常主要关注封装和数据隐藏;因此鼓励使用 “setters” 和 “getters” 方法访问其他私有的属性数据。对于 Java 式的思考方式,如果您希望向数据访问和修改中添加计算功能和副作用,则需要提前使用显式的方法调用。当然,Java 方法生成的结果比较冗长,并且某些时候必须遵守一些人为规定的规则:编写 foo.getBar()(而不是 foo.bar)和 foo.setBar(value)(而不是 foo.bar=value)。
作为这方面的一种独特技术,有必要提到 Ruby。实际上,Ruby 在数据隐藏方面要求比 Java 更严格:所有 属性始终 是 “私有的”;您决不能 直接访问实例数据。同时,Ruby 使用了某些语法约定,使方法调用类似于其他语言中的属性访问。第一个约定是在方法调用中使用 Ruby 的圆括号(可选);第二个约定就是使用半专有的方法命名,其中使用了在其他语言中作为运算符的符号。因此在 Ruby 中,foo.bar 仅仅是调用 foo.bar() 的一种更简短方法;而 “设置” foo.bar=value 则是 foo.bar=(value) 的一种简略形式。实际上,所有内容 都涉及到方法调用。
Python 要比 Java 或 Ruby 更加灵活,这个优点既值得称道,同时也为人们所诟病。如果您在 Python 中访问 foo.bar,或设置 foo.bar=value,您可能使用了一个简单的数据值,或者调用了某些半隐藏的代码。此外,在后者中,至少有六种不同方法可以访问代码块,各种方法之间稍有不同,这些细微差别极易混淆。过多的方法损害了 Python 的正则性,使非专家人员(甚至专家)难于理解。我知道为什么这些方法都自成体系:因为新的功能是分步添加到 Python 的面向对象基础中的。但是我并不觉得这种混乱有什么值得高兴的。
更多精彩
赞助商链接