How does Python OOP compare to PHP OOP?
我基本上想知道Python是否有像PHP那样的OOP缺点。PHP一直在为最近几个版本开发OOP实践。它在PHP中越来越好,但它仍然不完美。我对python还不熟悉,我只是想知道python的OOP支持是更好还是比较好。
如果在python oop中有一些问题不遵循正确的oop实践,我肯定会想知道这些问题。例如,据我所知,PHP不允许多重继承。
谢谢大家!
编辑:对公共和私人的支持如何?或支持变量类型。我认为这些对于构建OOP软件很重要。
- 多重继承是什么时候开始的?Java不支持多重继承。你的标准是什么?你能提供链接或定义吗?
- 这取决于你所定义的"适当"。许多OOP语言(Java、Objtovi-C、C*)不允许多重继承。
- PHP不允许按设计进行多重继承。python也可能遵循这种做法。它在大多数现代OOP语言中都很常见,因为多重继承会导致很多麻烦,因为大多数人没有正确地使用它。
- danherbert——python允许多重继承。
我想说的是,考虑到Python在其早期就被引入到语言中,而不是将OOP栓接到现有过程模型上的PHP,所以它对OOP的支持要好得多。
- 有趣。我认为类是在Python开发过程中相对较晚的时候添加的,但是一篇关于guido博客的文章说它是在第一次公开发布之前添加的。
- 杰森:不过已经修改过了。
- Python的1 +。PHP中的oop是一团乱麻。我不想把python推广给其他开发人员(也就是说,我的工作更少了),但是我从php开始,在用python编码之后,我不会以低于实际成本5倍的价格接受php项目(也就是说,在codeigniter中有一个小的动态网站,售价为50k,毫不夸张)。不过没人愿意付那么多钱,所以我想你能拿到照片。
- @Orokusaki你会为一个用python开发的动态小网站收取10000美元的费用吗?
- 对。我是个资本家。(小一点来说,我不是一本5页的网站小册子,我指的是位于Django的一个基于CMS的网站,具有定制功能,我只是不指全尺寸的软件包)。
- @orokasaki:在php(5.3)中OOP是怎样的一团乱麻?与Python相比,它有抽象类、抽象方法、接口、公共、私有和受保护的方法和属性修饰符,最后的修饰符…
Python的OOP支持非常强;它允许多重继承,并且所有东西都可以作为一个第一类对象(包括类、方法等)进行操作。
多态性通过鸭的分型来表达。例如,您可以以相同的方式遍历列表、元组、字典、文件、Web资源等等。
有很多小学究的东西都不符合OO标准,比如用len(list)而不是list.len()来获取序列的长度,但是最好不要担心它们。
- "显然不是oo"的意思是"不是典型的oo语法?"显然是OO,因为它是对象的len方法。
- @洛特-我怀疑这正是他的意思。实现是正确的OO,但语法不是。序列长度是序列对象的一个方面;理想情况下,语言语法将以这种方式表示它。
- @本:实现是否比语法更重要?或者您是否认为运算符重载"不正确的oop",因为语法错误?您是否希望1.minus()而不是-1,因为它更像OO?我真的不明白人们怎么能抱怨这个问题。
- 我喜欢Python的面向对象方面,但我确实厌倦了忘记在方法签名中键入"self"。
- @格伦:如果在Eclipse中使用pydev,它将在方法签名中为您键入self。
Python OOP模型的一个不寻常的方面是其封装机制。基本上,python假定程序员不会做坏事,因此它不会在任何程度上妨碍保护私有成员变量或方法。
它的工作原理是将成员的名称从两个下划线开始,以少于两个下划线结束。这样的标识符在任何地方都会发生变化,这样它们就可以在类名前面加上一个下划线。因此:
1 2 3 4 5 6 7 8
| class foo:
def public(self):
return self.__private()
def __private(self):
return 5
print foo().public()
print foo()._foo__private() |
以两个(或多个)下划线开头和结尾的名称不会被破坏,因此Python用于构建新实例的方法__init__是单独使用的。
这是一个更详细地解释它的链接。
- 另一方面,以两个下划线(结尾少于两个下划线)开头的名称会被破坏,但其他名称则不会。
- @记号麦克盖伊:请修正你的答案,而不是说它是"一个小错误"。
- 属性可用于控制如何访问属性。但有时我想拥有真正的私人属性。
- @洛特:还是错了吗?
另外:与PHP不同,Python具有本机运算符重载(尽管它确实存在扩展)。不管你爱还是恨,它就在那里。
我认为在这一点上它们是可比的。作为一个简单的测试,我怀疑在企业应用程序体系结构的设计模式或模式中有任何模式,可以说是OOP中最具影响力的两本书,这两种语言都不可能实现。
这两种语言自诞生以来都有了飞跃。
就多重继承而言,它经常会产生比它解决的问题更多的问题,而且,现在,作为一个有意的设计决策,语言通常被排除在外。
- 您还可以在C中实现任何设计模式。C是否与Python一样面向对象?
- 嗯。维基百科文章的链接描述了Mi的问题,以及如何用各种语言处理这些问题。本文还描述了Python的解决方案(MRO)。我不知道你通过链接到这篇文章能完成什么。
如果你在寻找"更纯粹"的OOP,你应该看看Smalltalk和/或Ruby。
随着对OOP的支持,PHP已经有了很大的发展,但是由于它的工作方式(每次都重新加载所有内容),如果遵循OOP最佳实践,事情可能会变得非常缓慢。这就是您不太了解PHP在Rails上的原因之一。
- 另外,因为PHP的元编程能力不能与Ruby、Smalltalk甚至是Python相匹配。