全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
953 0
2020-10-15
将Python面向对象的代码与Java进行比较
您是否避免使用Python OO功能,而是选择过程/功能模型?这种趋势在PHP之类的语言中很常见,许多程序员选择不使用OO功能。但是您可能会错过重要的机会!Java需要一种OO方法,从而在您编写的每一行代码中为您提供该模型的优势。
概述:面向对象
程序员是习惯的创造者,除非有某些令人信服的理由接受新语言,否则我们倾向于坚持既定的语言功能。面向对象(OO)功能是此问题的一个很好的例子。PHP程序员认为PHP的OO功能是一个好主意-但请尽量不要使用它们。许多Python程序员都喜欢这个故事,他们更喜欢不使用Python的OO功能。
Java位于语言的另一端:它是一种OO语言,因此使用Java不会脱离类。尽管有Java的OO谱系,但是仍有许多Java代码以过程方式编写。
为什么这种偏见(或可能滥用)OO?我认为这可以归结为个人倾向和工程判断力的结合。如果PHP或Python程序员对这些语言之一有丰富的经验,并且不经常使用OO功能,则可能由于简单的惯性而无法使用。但是某些开发任务在OO环境中可能比在熟悉的过程/功能范例中更好地实现。
OO编程确实会导致诸如堆碎片或其他不确定的平台状态(例如性能下降)之类的问题。确实,OO堆使用问题是C ++在嵌入式开发项目中花很多年时间替换C的原因之一。早在1990年代,磁盘,CPU和内存的价格如此之高,至少在设计人员看来,他们不使用OO语言(这也排除了使用这些新兴语言可能带来的生产率提高)。
我认为可以很公平地说,除非没有其他选择,否则许多Python程序员会避免使用OO功能。在本文中,我比较了Python和Java,以显示它们如何在复杂性和速度上相互堆叠。我希望这可以进行客观评估!
让我们看一些从Python开始的代码。
Python类
与一般的Python一样,Python OO范例非常简洁,如清单1中的简单类所示。
清单1 —一个Python类。
班级学生:
    def __init __(个人,姓名,年龄,专业):
        self.name =名称
        自我年龄=年龄
        self.major =主要
    def is_old():
        返回self.age> 100
该学生类有三个数据成员:姓名,年龄,以及重大课题。
在__init __()方法是最接近Python有一个构造函数。注意使用self.name初始化实例的状态。还包括一个简单的方法is_old()(以“年龄稍有偏见”的方式)确定基础学生是年幼还是年老(“年长”超过100岁)。
清单1中的代码说明了OO编程的一大优点:代码和数据彼此紧邻。数据当然是状态的存储库,因此使用OO可以以对程序员有用的方式将代码,数据和状态组合在一起。显然,您无需使用OO代码就可以完成所有这些操作,但是OO使其具有相当漂亮的简单性。
切记:地球上大多数源代码都存在,可以对某些现实世界的实体或过程进行建模。对于这种建模,OO是一种非常清晰的最小阻抗技术。这甚至可能是不惜一切代价使用OO方法的一个令人信服的理由!
等效的Java类
清单2显示了一个等效的Java类,不要被我们的Python编码工作所淘汰。
清单2-一个Java学生班。
公共班学生{
        字符串名称;
        年龄
        弦专业;
        Public Student(){
                // TODO自动生成的构造函数存根
        }
        公开学生(字符串名称,年龄,字符串专业){
                this.name =名称;
                这个年龄=年龄;
                this.major = major;
        }
}
清单2中的Java代码与清单1中的Python代码非常相似。请注意,使用OO可以使用这两种语言生成易于阅读的代码。清单1不可能使Java程序员感到困惑,即使没有Python的背景。同样,精通Python OO功能的Python程序员将很容易理解清单2中的Java代码。
因此,这是我们的第一点:编写良好的OO代码可以帮助提高语言间的可理解性。
为什么这很重要?在我们的多语言时代,这种可理解性是值得追求的。(有关此主题的更多信息,有兴趣的读者可以查看我的博客和最新的电子书。)
可以通过在Web上快速采用应用程序部署以及伴随使用浏览器访问这些应用程序来定义软件的现代时代。用户现在通常需要从Web托管的应用程序中请求过去称为“桌面功能”的内容。通常不能仅使用一种编程语言来提供这种可用性。程序员必须越来越熟悉多种语言:Java,Scala,JavaScript,HTML,CSS,Python,SQL等。
速度问题:Python与Java代码
速度永远是一个问题。让我们修改清单1,以便我们可以了解底层代码的速度。
运行Python代码
清单3展示了一个简单的(玩具)程序,该程序试图对平台“施加一点压力”。
清单3-定时程序运行
导入时间
班级学生:
    def __init __(个人,姓名,年龄,专业):
        self.name =名称
        自我年龄=年龄
        self.major =主要
    def is_old():
        返回self.age> 100
开始= time.clock()
对于xrange(500000)中的x:
    s =学生('John',23,'Physics')
    打印'学生%s已有%s岁,正在学习%s'%(s.name,s.age,s.major)
    打印'学生年龄大吗?%d'%(s.is_old())
停止= time.clock()
打印停止-开始
清单3是清单1的略微增强版本。此修订后的代码执行以下操作:
导入时间模块。
在程序的开头创建一个时间快照。
实例化大量的Student对象。
访问每个对象内的数据。
拍摄时间快照并减去原始时间。
显示运行程序所需的时间。
诚然,这是一个相当粗糙的测试。但让我们来看一个创建500
约翰学生23岁,正在学习物理
学生老了?0
29.8887370933
我们可以将其视为基准测试:500
约翰学生23岁,正在学习物理
学生老了?0
48.2298926572
由此可见,运行800
约翰学生23岁,正在学习物理
学生老了?0
97.3272409408
1
现在,让我们使用Java进行比较运行。
运行Java代码
清单4展示了一个简单的Java程序,该程序也尝试对该平台施加一些压力。
清单4-Java测试程序
公共班学生{
        字符串名称;
        年龄
        弦专业;
        Public Student(){
                // TODO自动生成的构造函数存根
        }
        公开学生(字符串名称,年龄,字符串专业){
                this.name =名称;
                这个年龄=年龄;
                this.major = major;
        }
        公共字符串getName(){
                返回名称;
        }
        公共无效setName(String name){
                this.name =名称;
        }
        public int getAge(){
                返回年龄
        }
        public void setAge(int age){
                这个年龄=年龄;
        }
        公共字符串getMajor(){
                返回专业
        }
        public void setMajor(String major){
                this.major = major;
        }
        公共静态void main(String [] args){
                长startTime = System.currentTimeMillis();
                对于(int i = 0; i <500000; i ++){
                        学生人数=新学生(“约翰”,23岁,“物理”);
                        System.out.println(“ Student” + student.getName()+“是”
                        + student.getAge()+“岁,正在学习” + student.getMajor());
                }
                long估计时间= System.currentTimeMillis()-startTime;
                System.out.println(“时间估计:” +估计时间/ 1000);
        }
}
注意,在清单4中,我包括了自动生成的getter和setter方法。经验丰富的Eclipse Java开发人员一直在使用此功能。getter和setter由Eclipse自动生成。这对于两个构造函数也是如此。这种提高生产力的方法确实非常方便,并且由于此类代码是机器生成的,因此完全没有错误。
让我们使用500
约翰学生23岁,正在学习物理
学生老:假
预计时间:31
500
约翰学生23岁,正在学习物理
学生老:假
预计时间:50
800
约翰学生23岁,正在学习物理
学生老:假
预计时间:104
对于1
让我们将结果制成表格以进行比较。
比较速度测试
对象数
Java速度
Python速度
500
31
30
80万
50
48
1
104
97
测试结果表明,Python代码的性能略优于Java代码。这并不意外。Java可能被称为“重量级”主流语言。它带有一定数量的行李,包括但不限于以下行李:
可移植性。这仅表示Java字节码将在具有适当Java虚拟机(JVM)的任何平台上运行。
类型安全。如示例所示,类型安全性与内存安全性密切相关。此语言功能有助于避免尝试将无效位模式复制到给定存储区的情况。
内置安全性。Java安全模型基于沙箱,其中的代码可以安全运行,并且对基础平台的负面影响最小。
与任何技术一样,此功能集需要付费。但是,如表所示,在当前测试环境中的成本并不完全过高。
这是我们的第二点:OO确实有成本,但是考虑到您获得的所有额外功能,它相对便宜。
扩展测试
我为该示例运行的测试非常简单。更为实际的测试可能使用读写数据库或发送和接收网络流量的对象。如果此类程序中的数据是从文件派生的,这将有助于使用磁盘I / O加载应用程序。
运行代码
Python可以从命令行运行;更方便的是,您可以在集成开发环境(IDE)(例如Eclipse)中运行它。我更喜欢使用IDE,因为它们提供了许多生产力增强功能:代码生成,单元测试,程序包和模块创建等。
使用Python和Eclipse入门很容易:安装Eclipse,然后使用Eclipse Marketplace安装PyDev插件。创建一个Python(或PyDev)模块,然后您就可以开始创建Python代码了。
当然,在Eclipse中运行Java代码甚至更加容易,因为默认安装已经包含了对Java的支持。而且,我们不要忘记所有Java辅助生产力的增强:代码完成,代码生成(getter,setter,构造函数等),重构等等。
不管您选择哪种语言或编程模型(OO还是过程或功能),都不能否认使用Eclipse之类的现代IDE可以大大提高生产力。这种类型的工具以代码生成,重构和通过插件的工具集成的形式促进了敏捷开发。
最后的想法
OO语言是1990年代一定程度的不信任的主题。那时,许多组织宁愿坚持使用主流语言(例如C),而不是采用新的C ++。Java随之而来,我认为可以说C ++不再是事实上的OO语言。
如今,毫无疑问,OO语言已在嵌入式平台中广泛使用。但是,在使用Python和PHP等语言使用OO功能方面仍然存在一些阻力。这种抵制的原因可能与程序员的喜好更多有关,而不是与现实有关!
比较不同语言的OO代码的一个有趣的方面是这些语言之间的通用性。Python OO代码与Java中的等效代码没有太大不同。在多语言时代中使用OO功能可以帮助程序员编写出良好的代码,这可以认为是一种优势。维护程序员和生产支持人员通常会收到更简单的代码。

关注 CDA人工智能学院 ,回复“录播”获取更多人工智能精选直播视频!


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群