Python和Java包命名方式比较

Java语言使用分层包名,而Python语言不使用。Java使用反向域名作为包名是一种约定,例如,对于一个Stack Overflow的Java包,代码应该放在com.stackoverflow包下。而Python的一个包却使用了类似Java的约定,这引发了人们的讨论和疑问。为什么会出现这种差异?使用哪种方式有各自的优点和缺点?这些优点和缺点是否适用于这两种语言?

2、解决方案:

有关这个问题,有以下几种观点:

  1. Python不使用这种命名方式,是因为这样会产生一个问题:谁拥有几乎所有其他东西的子包的“com”包?Python通过文件系统层次结构来建立包层次结构的方法与此约定非常不兼容。Java之所以能够解决这个问题,是因为包层次结构是由传递给package语句的字符串文字的结构定义的,因此任何地方都不需要显式的“com”包。

  2. 假设Guido本人宣布应该遵循反向域名约定,除非对python中的导入实施重大更改,否则不会被采用。Python在运行时使用故障快速算法搜索导入路径,而Java在编译时和运行时都使用穷举算法搜索路径。将目录按如下方式排列:

folder_on_path/
    com/
        __init__.py
        domain1/
            module.py
            __init__.py


other_folder_on_path/
    com/
        __init__.py
        domain2/
            module.py
            __init__.py

然后尝试:

from com.domain1 import module
from com.domain2 import module

只有其中一个语句会成功。这是因为folder_on_path或other_folder_on_path要么在搜索路径中更高。当Python看到from com.时,它会抓住它能找到的第一个com包。如果恰好包含domain1,则第一个导入将成功;如果不是,它将抛出ImportError并放弃。为什么?因为导入必须在运行时发生,可能在代码流的任何一点(尽管最常见的是在开头)。在这一点上,没有人想要一个穷举的树形遍历来验证是否没有可能的匹配项。它假设如果它找到一个名为com的包,那么它就是com包。

  1. Python的风格更简单。Java的风格允许不同组织具有同名的产品。您可以轻松地为Python设置顶级包,例如“com”、“org”、“mil”、“net”、“edu”和“gov”,并将您的包作为这些子包。这样做有一些复杂性,因为每个人都必须合作,并且不要用他们自己的东西污染这些顶级包。Python没有这样做,因为实际上命名冲突相当罕见。Java开始这样做,因为开发Java的人预见到许多人毫无头绪地为他们的包选择了相同的名称,并且需要解决冲突和所有权问题。

  2. 当Sun推出Java时,它带有轰动效应和炒作。Java应该接管一切。大多数未来的相关软件开发都将在网络交付的Java小程序上进行。在这种情况下,预先建立基于互联网、对公司友好的命名约定是合理的。随着时间的推移,Java并没有像Sun希望的那样取得成功,但这证明了他们提前为成功做准备的远见。Python最初是Guido van Rossum的一个项目,社区花了一些时间才确信如果van Rossum被公共汽车撞了,它能够生存下来。据我所知,最初没有计划要接管世界,也没有打算作为网络小程序语言。因此,在该语言的形成阶段,没有理由想要一个庞大的层次结构作为命名方案。在那个更非正式的社区中,人们选择了一个或多或少异想天开的名字,并检查是否有人已经在使用它。

  3. 这是一个防止名称冲突的好方法,并且充分利用了现有的域名系统,因此不需要额外的官僚机构或注册。它简单而聪明。反转域名名还赋予其层次结构,这很方便。因此,您可以在末尾放置子包。唯一的缺点是名称的长度,但对我来说这不是缺点。我认为对于任何支持它的语言来说,这是一个非常好的主意。

  4. 这个想法是保持命名空间无冲突。使用反向域名不容易与其他人的域名冲突。非常简单,但很实用。此外,在使用第三方库时,它可以让你知道它们来自哪里(用于更新、支持等)。

  5. Python确实有分层包命名方式,但它是一个更加扁平的层次结构。例如,看看os.path。没有什么能阻止库设计者做出更深层次的命名方式,比如Django。从根本上讲,我认为Python的设计理念是,您希望在无需提前指定或键入太多内容的情况下完成任务。这极大地帮助了脚本和命令行使用。在“Python的禅意”中,有几个部分论述了这样做的理由:

简单优于复杂。
扁平优于嵌套。
美丽优于丑陋。(Java系统对我来说看起来很丑。)

另一方面,有:

命名空间是一个非常棒的想法——让我们做更多这样的事情!

### Python Java 的基础知识对比 #### 语法简洁度 Python 设计之初就强调代码的可读性简洁性,其语法结构相对简单直观。缩进在 Python 中不仅用于增强代码美观度,更是语法规则的一部分[^1]。 相比之下,Java 更加严格遵循面向对象编程原则,在定义类、方法时需要更多的关键字符号支持。例如变量声明必须指定数据类型,而 Python 则采用动态类型机制,无需显式声明变量的数据类型。 #### 数据类型处理方式 Python 支持多种内置数据类型如列表(list),元组(tuple),字典(dict)等复合型容器,并且这些类型的创建与操作都非常简便灵活;同时它还拥有强大的第三方库来扩展功能[^2]。 对于 Java 来说,虽然也具备丰富的集合框架(Collection Framework),但是使用起来往往更复杂一些,因为开发者通常要先导入相应的才能利用其中的功能。 #### 面向对象特性实现差异 两种语言都全面支持面向对象程序设计(OOP)理念中的封装(encapsulation)、继承(inheritance)以及多态(polymorphism)。不过具体到某些细节上会有所不同: - **构造函数**: 在 Java 中每个类都可以有一个或多个构造器用来初始化新创建的对象实例属性值;而在 Python 类里可以通过`__init__()`特殊方法达到相同目的。 - **访问控制修饰符**: Java 提供了 public,private,protected 关键词明确指出成员变量或者方法可以被谁访问;然而 Python 并没有真正意义上的私有成员概念,默认情况下一切都是公开(public)状态,尽管存在命名约定 `_var`(受保护) 或者 `__var`(伪私有化) 来暗示程序员哪些不应该随意更改。 ```java // Java example public class Person { private String name; // Constructor public Person(String n){ this.name = n; } } ``` ```python # Python equivalent class Person: def __init__(self, name): self.__name = name # pseudo-private attribute ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值