Python面向对象编程和PHP面向对象编程有什么区别?

17

我想知道Python是否像PHP一样存在面向对象编程(OOP)的缺陷。PHP已经在过去几个版本中发展了他们的OOP实践。虽然PHP变得越来越好,但它仍然不完美。我刚接触Python,想知道Python的OOP支持是否更好或者只是可比较的。

如果Python OOP存在一些不遵循合适OOP实践的问题,我肯定想知道。例如,PHP至少我所知道的并不支持多重继承。

谢谢大家!

编辑:Python对于Public和Private的支持如何?还有变量类型的支持如何?我认为这些对于构建OOP软件非常重要。


15
多继承什么时候成为“真正的面向对象编程”?Java不支持多继承。你认为什么是“真正的面向对象编程”的标准?能否提供相关链接或定义? - S.Lott
1
这取决于你如何定义“适当”。许多面向对象编程语言(Java、Objective-C、C#)不允许多重继承。 - Nosredna
2
PHP的设计不允许多重继承。Python可能也遵循这种做法。在大多数现代面向对象编程语言中,这是很常见的,因为多重继承可能会导致很多麻烦,因为大多数人都无法正确使用它。 - Dan Herbert
7
Python允许多重继承。 - Nosredna
6个回答

20

我认为Python的面向对象支持要更好,因为它在语言的早期阶段就引入了面向对象,而PHP则是将面向对象 bolted 到现有的过程模型中。


有趣。我认为类是在Python的开发相对较晚时才添加的,但是阅读Guido的博客说它是在第一次公开发布之前添加的。 - Jason Baker
Jason:不过它们已经被修订了。 - troelskn
Python很赞。PHP中的OOP很混乱。我并不是试图向其他开发人员推销Python(减少我的工作量),但我开始使用PHP,然后在Python中编码后,我不会接受低于其真实成本5倍的PHP项目(例如,在CodeIgniter中制作一个小型动态网站需要50k,没有夸张)。然而,没人会付那么多钱,所以我认为你能明白我的意思。 - orokusaki
1
@orokusaki 你会为一个小型的Python动态网站收取$10,000的费用吗? - Carson Myers
是的,我是资本家。(我的意思不是一个5页的网站手册,而是基于Django的CMS网站具有自定义功能,但我并不是指一个完整的软件包)。 - orokusaki
10
与Python相比,PHP(5.3)中的面向对象编程有哪些混乱之处?它具有抽象类、抽象方法、接口、公共、私有和受保护的修饰符,可以用于方法和属性,还有最终修饰符。 - Tom Pažourek

8
Python的面向对象编程模型中有一个不同寻常的封装机制。基本上,Python假设程序员不会做坏事,因此它不会费太多力气来保护私有成员变量或方法。
它通过对以两个下划线开头并以少于两个结尾的成员名称进行重命名来实现。这样的标识符到处都被更改,使得它们具有在其前面添加类名,并在其前面添加一个额外下划线的形式。例如:
class foo:
    def public(self):
        return self.__private()
    def __private(self):
        return 5

print foo().public()
print foo()._foo__private()

以两个(或更多)下划线开头和结尾的名称不会被混淆,因此用于构建新实例的 Python 方法 __init__ 保持不变。

这里有一个链接,可以详细解释。


相反的是,以双下划线开头(并以不到两个下划线结尾)的名称会被破坏,但其他名称则不会。 - mipadi
@TokenMacGuy:请修正您的答案,而不是说它“有点错误”。 - S.Lott
1
属性可用于控制如何访问属性。但有时我想要真正的私有属性。 - Bastien Léonard

8
Python的面向对象编程支持非常强大,它允许多重继承,并且一切都可以作为一等对象进行操作(包括类、方法等)。
多态性通过鸭子类型表达。例如,您可以以相同的方式迭代列表、元组、字典、文件、网络资源等。
有很多小而琐碎的事情,可能不符合面向对象编程的规范,比如使用len(list)获取序列长度而不是list.len(),但最好不要过于担心这些问题。

6
“debatably not OO” 的意思是“不典型的面向对象语法”吗?显然它是面向对象的,因为它是对象的 len 方法。 - S.Lott
3
@S. Lott — 我猜这正是他的意思。实现方式是正确的面向对象编程,但语法却不是。序列长度是序列对象的一个方面;理想情况下,语言语法应该以那种方式表达它。 Translated: @S. Lott - 我怀疑这正是他的意思。实现方式是正确的面向对象编程,但语法不够符合要求。序列长度是序列对象的一个方面;最好的情况是,语言语法能够以这种方式表达它。 - Ben Blank
3
@Ben: 实现比语法更重要,你认为运算符重载“不是真正的面向对象编程”是因为语法不正确吗?你会选择1.minus()而不是-1,因为它更符合面向对象编程吗?我真的不明白人们如何抱怨len问题。 - nikow
5
我喜欢Python中的OO方面,但我真的很厌烦忘记在我的方法签名中输入“self”。 - Glenn
@Glenn:如果您在Eclipse中使用Pydev,则在方法签名中它会为您键入self。 - Kiv

3
我认为它们在这一点上是可比的。作为一个简单的测试,我怀疑在面向对象编程中最有影响力的两本书《设计模式》《企业应用架构模式》中没有任何模式是不可能在两种语言中实现的。
自它们诞生以来,两种语言都有了长足的发展。
至于多重继承,它经常带来更多问题而非解决之道,并且现在很常见地被故意省略在语言设计中。

10
你可以在C语言中实现任何设计模式。C语言和Python一样面向对象吗? - Bastien Léonard
嗯,维基百科文章中描述了MI存在的问题以及在各种编程语言中如何处理这些问题。文章还描述了Python的解决方案(MRO)。我不确定你通过链接到该文章能够实现什么目的。 - tzot

3
此外:Python具有本地运算符重载,而PHP则不然(尽管存在扩展)。无论你喜欢还是讨厌它,它都在那里。

1
如果你正在寻找“更纯粹”的面向对象编程,你应该看看SmallTalk和/或Ruby。
PHP在支持OOP方面已经有了很大的发展,但由于它的工作方式(每次重新加载所有内容),如果遵循OOP最佳实践,事情可能会变得非常缓慢。这也是为什么你很少听到关于PHP on Rails的原因之一。

而且因为PHP的元编程能力无法与Ruby、Smalltalk甚至Python相媲美。 - Sasha Chedygov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接