“ Java OOP”和“ Pythonic OOP”之间的区别?[关闭]


19

我从ActionScript 2.0开始,然后又从Java开始。从那以后,我已经学习或至少使用了一堆语言,包括Python(可能是我的最爱)。

恐怕我的面向对象编程风格非常不符合Python风格,更像带有Python语法的Java OOP。是什么使Java like和Pythonic OOP彼此不同?用Python编写面向对象的代码时,Java程序员经常做什么?

Answers:


54

对于Java家伙来说, Python是一种无政府玩耍的人,任何人都可以抓住俱乐部,并开始伤脑筋。

对于Python家伙来说, Java是一个Orwellian的宇宙,您会不断受到别人对宇宙tick嗒声逐渐减少的看法的束缚。

事实是您可以用一种语言做的任何事情都可以用另一种语言做得一样干净。但是,正如您已经提到的,这两个社区在清洁手段上有重要区别。

Java方式: 干净的系统是按照预期的目的运行的系统,它不做任何其他事情,它不允许进行与预期用途不符的扩展或修改,并尝试通过编译器尽可能多地强制实施。通过在严格的结构内精心设计简单的界面可以获得灵活性。在Java中,应该始终清楚地限制沙盒,并在编译器快速反馈的情况下超越这些沙盒。Java提供了静态定义对象结构并从它们的实例创建动态交互的方法。当我使用Java时,我尝试巧妙地创建基本的构建模块,以解决大脑瘫痪的问题。一旦我对如何解决该问题有了一个可行的理论,我就会自下而上地工作。

Java将倾向于生产可以跨大团队的大型软件,并提供控制群的工具和手段。如果任其发展,这将导致非常支离破碎的团队独立工作,以实现越来越模糊的目标。最终,每个团队都变成了自己的“存在理由”,整个系统被淡化了,导致误入主要项目。这些可能导致极端的成本超支以及性能和维护不佳的大型软件系统。

用Java来做事几乎没有一种快捷简便的方法,但是只需单击几下鼠标,IDE和工具就可以完成痛苦的任务。

Python方式: 干净意味着简洁且易于阅读。一个好的python系统旨在让您深入了解它的核心,并以一种可以从代码中了解其预期用途和目的的方式来揭示其最内在的秘密。它还将允许您通过扩展和/或封装原始设计来围绕自己的方向设计自己的解决方案。Python提供了创建对象模板的方法,您可以从中动态更改实例以适应手头的需求。在python中,我倾向于立即解决问题,然后以逻辑结构传播代码,以使最终解决方案保持尽可能简单和可读。在python中,我倾向于自上而下地工作,并通过分而治之的方法来管理增加的复杂性。

Python团队倾向于生产轻型系统,并且会很快提供可行的解决方案。他们将趋于紧密地联系在一起,在系统的任何部分上互换,从而每当有机会时就相互验证对方的解决方案。他们彼此取食,产生了令人振奋的协同作用。但是,这将导致团队难以扩展到更大的系统,并且经常碰到玻璃天花板。在团队中引入新成员会有所帮助,但要花一些时间才能使知识充分传播以使您感受到额外的生产力。然后,团队变得分散了,整个系统的持续概览和早期的气氛一样变淡了。这可能会使代码过于复杂,从而使原来曾经是一个简单的问题,

几乎总有一种使用Python进行操作的快速简便的方法,但是一旦系统达到特定阈值,就很难控制复杂性。

简而言之,两者都有阴暗面,并且都有明显的强度。但是,当在两个社区中搜寻时,您会发现其中一个的力量导致了另一个的黑暗面,反之亦然。

因此,关于哪个最佳的激烈辩论。


14

因此,您知道有关设置方法和变量的可见性的全部内容吗?是的,那些已经不存在了,一切都是公开的。有命名约定和名称修饰,但实际上所有内容仍然可用。

Python的灵活性的部分原因在于您几乎可以做任何事情。因此,人们的哲学是人们应该知道如何使用API​​,而不是API要求正确使用方法。

您可以使用默认变量来代替方法重载。不要使用可变对象作为默认值。

# bad
def fL(x=[])
  x.append(1)
  print x
# good
def fN(x=None)
  if (x is None):
    x = []
  x.append(1)
  print x

fL()
fL()
fN()
fN()

刚开始时,类变量和实例变量之间的差异非常细微。

class Obj(object):
   thing = "class variable"
   def __init__(self):
      self.thing1 = "instance variable"
      print self.thing, self.thing1

这些是我进行切换时必须习惯的一些事情。


1
+1了一些好东西的摘要,尽管我以前知道这些
-Anto

6

嗯,Python没有接口,没有元类,并且允许鸭子输入。Python具有列表理解功能,这些功能非常强大,并且在Java中不存在。Java具有类型丰富的系统,其中包含许多数据结构,而Python仅具有列表。因此,如果您利用Python的功能而不是尝试重新创建Java在Python中的功能,则可能是在编写Pythonic代码。

但是就OO代码而言,某些样式的基本知识不应因语言而异:无论您使用Applescript,Python,Java还是C ++编写代码,都应始终努力编写Shy和DRY的代码。

- - 编辑 - -

正如@delnan指出的那样,Python实际上在内核级别定义了五种复合数据类型(列表,字典,元组,集合和Frozenset,根据我的“坚果壳Python”副本)。虽然这是事实,但实际上与我要提出的观点无关:Python建立在列表上作为基本数据结构。是的,您可以将列表用作堆栈,但是可以将完全相同的列表用作队列。然后再次堆叠。

另一方面,Java具有一个内核数据结构(根据“ Java Pocket Guide”,该数组为数组),但是在一般情况下,如果不导入集合,就无法在Java中完成很多工作。一旦这样做,就可以访问到一个“丰富”(在某种意义上,我的意思是非常复杂)类型库,通过它可以获得与Python列表相同的功能。

当然,两种语言都有类,Java有接口,但是尽管它们是复合数据类型,但从教科书的意义上来说,它们并不是真正的数据结构。

一个区别是您不能从Java队列中弹出项目,也无法在需要Java链表的地方传递Java队列对象。因此,也许“富裕”实际上是指“刚性”。

因此,要解释我所说的“ Python只是有列表”的意思,我的意思是,您可以使用Pythons List类型执行与Java Collections一样的几乎所有Python操作。在Java中,这种单一类型可以完成许多类型的工作。

这对Python程序员意味着什么?这意味着您可以利用Python List类型来编写非常精巧的直接代码,而无需使用其他库-诚实(即用更少的字符传达更多价值的特征)是“ Pythonic”代码的核心特征。


除了元类,我对所有其他语言都很熟悉,将对其进行查找。谢谢您:)
Anto

7
-1直到您可以解释以下内容:(1)“ Python仅具有列表”-Python具有丰富的数据结构。它没有设想过的每个数据结构都具有三个实现,但是仍然是大多数人需要的每个实现。(2)将Java的类型系统称为“丰富”是对那些真正复杂的类型系统的嘲笑。对于初学者,请查看Haskell(98,没有任何扩展名)。

抱歉,这不是事实。Python具有两种数据结构:列表和字典。一些Python LIBRARIES可能会扩展这些核心结构,但这与说该语言具有它们是不同的。
Philosodad 2011年

5
这已经是答案名称的两倍。该列表是堆栈的两倍。还内置了集合和元组(Java内置了多少个数据结构?)标准库中还包含用于(最小)堆,双端队列,不可变记录和紧密堆积的同质数组(仅限于C)的模块。类型)。那只是从我的头上。是的,其中大多数都在内部使用列表/字典(但是,集合不是未使用键的字典)。但是大多数Java集合也是如此-实际上,所有语言都如此。这就是它的工作原理。

1
现在,我想我明白你想做出点(并删除我的downvote -这是我在第一时间加入,因为这部分是简单的错误它最初规定的方式)。我仍然认为您至少需要考虑两个数据结构(列表作为几乎通用的序列,而字典是几乎通用的映射)。更不用说各种迭代器和生成器了,我至少经常(和(甚至更多))将其用作列表。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.