作为一名学习Python的Java程序员,我应该注意什么?[已关闭]

2022-08-31 15:42:16

我的大部分编程背景都是Java,我仍然在Java中完成大部分编程。但是,我开始在工作中的一些副项目中学习Python,并且我想尽可能独立于我的Java背景来学习它 - 也就是说,我不想只用Python编写Java。我应该注意哪些事情?

一个简单的例子 - 在浏览Python教程时,我遇到了一个事实,即函数的默认可变参数(如列表)是持久的(从调用到调用时记住)。作为一名Java程序员,这对我来说是违反直觉的,而且很难理解。(如果您不理解这个例子,请参阅此处和此处

有人还向我提供了这个列表,我发现它很有帮助,但很短。任何人都有任何其他例子来说明Java程序员如何倾向于滥用Python...?还是Java程序员会错误地假设或难以理解的事情?

编辑:好的,简要概述了我链接到的文章所解决的原因,以防止答案重复(如蜥蜴比尔所建议的那样)。(如果我在措辞上犯了错误,请让我知道,我刚刚开始使用Python,所以我可能无法完全理解所有概念。免责声明 - 这些将非常简短,所以如果你不明白它得到了什么,请查看链接。

  • Java中的静态方法不会转换为Python类方法
  • Java中的switch语句转换为Python中的哈希表
  • 不要使用 XML
  • Getters和setters是邪恶的(嘿,我只是引用:))
  • 代码重复在Java中通常是必要的邪恶(例如方法重载),但在Python中不是。

(如果你觉得这个问题很有趣,无论如何都要查看链接。:)这很好。


答案 1
  • 不要把所有东西都放进课堂里。Python的内置列表和字典将带你走得更远。
  • 不要担心每个模块保留一个类。按用途而不是按类划分模块。
  • 将继承用于行为,而不是接口。不要为“Dog”和“Cat”创建“Animal”类以从中继承,这样就可以拥有通用的“make_sound”方法。

只需执行以下操作:

class Dog(object):
    def make_sound(self):
        return "woof!"

class Cat(object):
    def make_sound(self):
        return "meow!"

class LolCat(object):
    def make_sound(self):
        return "i can has cheezburger?"

答案 2

引用的文章有一些很好的建议,很容易被错误引用和误解。还有一些不好的建议。

把Java抛在脑后。重新开始。“不要相信你[基于Java的]直觉”。说事情是“反直觉的”是任何编程学科的坏习惯。学习一门新语言时,重新开始,放下你的习惯。你的直觉一是错误的。

语言是不同的。否则,它们将是具有不同语法的同一种语言,并且会有简单的翻译人员。因为没有简单的翻译人员,所以没有简单的映射。这意味着直觉是无益和危险的。

  • “Java中的静态方法不会转换为Python类方法。这种事情真的很有限,没有帮助。Python有一个静态方法装饰器。它还有一个类方法装饰器,Java没有等效项。

    顺便说一句,这一点还包括更有用的建议,即不要不必要地将所有内容包装在类中,“Java静态方法的惯用翻译通常是模块级函数”。

  • Java 中的 Java 语句可以通过多种方式实现。首先,也是最重要的,它通常是一个构造。这篇文章在这方面是无益的。如果你绝对确定这太慢了(并且可以证明这一点),你可以使用Python字典作为从值到代码块的稍微快一点的映射。盲目地翻译切换到字典(不假思索)是非常糟糕的建议。switchif elif elif elif

  • 不要使用 XML。断章取义时没有意义。在上下文中,这意味着不要依赖 XML 来增加灵活性。Java依赖于用XML描述东西;例如,WSDL 文件重复从检查代码中显而易见的信息。Python依赖于内省,而不是用XML重述所有内容。

    但是Python具有出色的XML处理库。几个。

  • Getters和setter在Python中不是必需的,就像它们在Java中需要的那样。首先,你在Python中有更好的内省,所以你不需要getter和setter来帮助制作动态bean对象。(为此,您可以使用 collections.namedtuple)。

    但是,您有属性修饰器,它将 getter(和 setter)捆绑到类似属性的构造中。关键是Python更喜欢裸属性;必要时,我们可以将 getter 和 setter 捆绑在一起,使其看起来好像有一个简单的属性。

    此外,如果属性不够复杂,Python具有描述符类。

  • 代码重复在Java中通常是必要的邪恶(例如方法重载),但在Python中不是。正确。Python使用可选参数而不是方法重载。

    要点接着谈到了关闭;这并不像明智地使用默认参数值的简单建议那样有用。