在不同的编程语言上学习OOP有什么区别吗?[关闭]


9

我想学习OOP。我了解Python,但对OOP知之甚少。

但是,当我在论坛上搜索“ learning OOP”时,我看到一个家伙在说:“ Python太新了,这就是为什么您不能在Python上学习OOP的原因。应该先学习Java,然后再理解Java上的OOP”。

是真的吗 在不同的编程语言上理解OOP有什么区别吗?喜欢在Java,C#,C ++,Perl或Python上学习它?


12
“ Python非常新,这就是为什么您不能在Pyton上学习OOP的原因。您学习Java之后又了解Java上的OOP”,这对我来说毫无意义。如果您想使用Python学习OOP,我看不出为什么没有。去吧!
FrustratedWithFormsDesigner 2014年

13
Python不比Java老吗?我相信那是我的头顶,但我可能要等上几年。
Jimmy Hoffa

2
@JimmyHoffa确实是。根据Wikipedia,91比95。
Evicatos

2
@JimmyHoffa:来吧,那不可能是真的,可以!我们都知道Java是有史以来的第一种OO语言。“太阳大声宣告Java的新颖性”…… –关于这个问题……您为什么决心学习面向对象?那很快就会强加于你。Python是一个很好的起点,可以深入了解多种编程范例的优势。
leftaboutabout 2014年

Answers:


10

作为理论构造的对象非常简单:它是存储数据,功能或同时存储这两者的结构。这些结构具有“自我”的感觉,这在Python之外的大多数语言中都是隐含的。这称为“描述符”,它为对象提供了一个自参考点,该点将数据(变量或字段)和函数(通常称为方法)绑定到所讨论的特定对象。这样的想法是,您专门使用的变量或方法属于该特定实例(通常在下面分配了内存),而不是某个更大,更通用的构造。

对象系统在两大类方面趋于变化:继承和访问。

有些语言(例如Java或C ++)要求您声明充当要分配的对象的“蓝图”的类。这些类及其对象一旦实例化就无法在结构上进行修改。在变量可以更改但结构是静态的意义上,它们可以覆盖其内容。例如,您不能在Java中向HashMap添加新方法。您可以扩展接口(基本上是部分实现的类,充当合同),也可以创建子类以获取所需的额外方法或变量,以及相关特定类的所有原始变量和方法。

其他基于类的语言(最经常引用的一种是Ruby)使您可以轻松打开现有类,并根据需要添加方法。这是争论的焦点,许多人认为这是非常非常危险的。

Javascript更加宽松,对象不过是变量或函数的插槽集合。只要程序员感到需要,就可以更改或覆盖它们。甚至可以将它们任意克隆为其他对象的“原型”,从而将其所有功能传递给他人。

访问控制是各种语言之间的另一个重要区别。

某些语言(例如Java)具有非常严格执行的访问修饰符,例如“私有”和“受保护”,它们精确定义了哪些类和子类可以使用给定的变量或方法。

其他诸如Python的形式较不正式,在方法或变量名称前使用下划线约定表示其私有。

最终,Python是以面向对象的方式进行编程的一种完全合法的语言,只是它没有像其他一些语言那样严格地执行它。


对于这个问题可能有点技术性。
2014年

@zeroth,也太具体了。“ self”(或“ this”)参数不是通用的。
哈维尔2014年

@Javier这就是为什么我说它在Python中是显式的,而在其他地方是隐式的。
世界工程师

问题是关于学习OOP的问题,我认为讨论如何编写语言来完成某些概念(例如privateJava的封装和__Python的下划线())是非常重要的。我认为Python的抽象级别可能会使它对初学者更具挑战性,但绝对不是不可能。Java向程序员说明了这一点,这可能会使某些概念更容易使用。
Derek W

@WorldEngineer我不是在谈论显式/隐式(同样,Python在这方面并不罕见),而只是作为一个概念存在。一些语言对所有参数进行多态分派,而不仅仅是对第一个。有些人针对特定版本使用其他提示,并且主样式可能不会将参数的特权授予“ this”。
哈维尔2014年

18

学习OOP 原理根本不是特定于语言的,因此,如果“学习OOP”是指“了解术语的含义,什么是OOP以及为什么要使用它”,那么语言就没有关系了。

如果您的意思是“学习如何使用OOP进行开发”,那么可以,不同的语言会以不同的方式处理它,但是它们都共享相同的原则。如果您像我一样,那么就可以最好地学习它。选择一种具有良好教程或书籍的面向对象语言,该教程或书籍涵盖了面向对象的方面并对此进行了介绍。如果您掌握了面向对象设计的原理,则可以在任何其他OO语言中使用它们。

“ Python非常新,这就是为什么您不能在Pyton上学习OOP的原因。您学习Java之后又了解Java上的OOP”

这只会使我的头部受伤。这么多错误塞进了一句话。

Python可以追溯到1989年。

http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html

Java到1995年。

http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html

您可以就该建议的有效性得出自己的结论。


1
是的,但是Python 1.0直到1994年才发布。Java在发布之前已有相当长的一段时间。但是我同意Python具有OO,并且您可以学习OO的概念。否则,这是荒谬的。
chubbsondubs 2014年

2
@chubbsondubs是的,那还早于Java!;)
Izkata 2014年

1
仅提供一个简单的对点,基于类的OOP(C ++,Java,Python和许多其他)与基于原型的OOP(JavaScript是我所知道的唯一使用此语言的语言)有很大的不同。它们仍然是OOP,具有相同的基础,并实现许多相同的目标,但是许多人认为类是他们认为OOP的一部分,而JavaScript没有它们,并且绝对是面向对象的。
KRyan 2014年

@KRyan:如果您在乎的话,还有另一种基于原型的OO语言称为Self。
杰里·科芬

ActionScript具有原型和类。
OrangeDog 2014年

8

我认为您所引用的人只是在表现语言沙文主义。

实际上,OOP的概念与OOP的实现之间存在差异。从诗意上讲,一旦您对OOP的某些概念有了更好的了解,就最好理解这一点。

许多程序员仅对几种类似的语言感到满意,因此他们不必扩展自己的功能,也不必承受一段时间的能力。

所以问题归结为,Python真的会教您OOP 的概念吗?

我会说可以的,只要您有足够的学习支持,并促使您尝试在自主学习中通常不会探索的事情。最好是一本书或某种导师。Mark Lutz撰写了有关Python的非常深入,非常详尽和非常出色的书籍,我会推荐他的书籍,因为它们会促使您去做并学到更多。

您要记住的是,Python的方法不是唯一的方法,也不是唯一的正确方法。您掌握的编程范例越多,您将成为一名更好的程序员。Python进行OOP的方式并不完全是C ++或Java的方式,但是这些概念可以很好地传递。


4
就OOP而言,Java和C ++彼此之间的差异以及与Python的差异都很大。
Gort机器人2014年

在一定程度上,但这很大程度上是由于语言设计知识的变化和不同的限制所致。
2014年

坦率地说,90%的OOP概念在它们之间可以很好地传递,甚至几乎看不见。
2014年

是的,我同意。想到Java和C ++在OOP方面是“相同的”,我觉得有点可笑。
Gort机器人2014年

4

是的,OOP实现非常不同。尽管其理论和原理是相同的,但是许多人只认为Java和C ++会执行“真正的OOP”,因此您会获得许多被认为“与语言无关”的引用,但实际上它们假定基于类的静态类型的语言。

这并不意味着这些参考文献是不好的,甚至是有限的。例如,“四人帮”(GoF)开创性著作“设计模式:可重用的面向对象软件的元素”是一个伟大作品的主要示例,当它真正表示“基于静态类的OOP”时,会说“ OOP”。

因此,我认为:是的,您可以在Python,Javascript,C和许多其他语言上学习很多OOP。但是有些人(可能是将来的雇主)在要求“ OOP经验”时表示Java / C ++ / C#。因此,也应该检查其他视图。

(而且这些不是OOP的仅有的两种“类型”。)


2
具有讽刺意味的是,基于类的OOP并不是Alan Key最初建议的OOP。但是很多“学习”的OOP都是关于学习设计/编码感知的,并不严格限于特定的OOP实现
Daniel Gratzer 2014年

2
查看CLOS也可能很有意义:我认为许多语言/框架都没有提供多种方法。
Giorgio 2014年

2
@jozefg:是的,Alan Kay曾经说过:“实际上,我是用术语“面向对象”来写的,我可以告诉你我没有C ++。
哈维尔2014年

1
@Giorgio其实迪伦可能提供CLOS的稍微简单的版本(没办法,指定一个多方法运行,但要简单得多的方式)
丹尼尔Gratzer

4

面向对象编程是关于如何构造编程语言以促进低耦合,信息隐藏(aka封装),捆绑数据以及将这些数据一起操作的方法以及代码重用的想法。许多语言都对这些想法付诸实践,因此语言在处理对象定向方面存在差异。例如,Java仅允许一个类扩展1个类。但是,Python和C ++允许您扩展任何数量的类。Java有其局限性的特定原因。限制旨在纠正C ++的问题,还因为Smalltalk仅支持单个基类。

OO语言可以分为两个族。Smalltalk系列语言(或基于类的OOP)包括C ++,Java,Smalltalk,Ruby,C#,Python等(此系列有很多)。这些混合了静态和动态类型的语言,尽管它们在某些概念上略有不同,但是它们对OOP的看法却非常相似。我的意思是,它们如何实现耦合,封装,绑定数据和方法以及代码重用,以及它们为您提供的工具。在这个家庭中,很多概念都是相同的。

另一个家族是基于原型的OOP。这些语言在OOP实现中看起来非常不同。可能最著名的例子是Javascript,但是Javascript从Scheme和Object LISP复制了这些想法。这些是鲜为人知的语言,通常是动态键入的。我想不出一种基于静态类型原型的语言,但这并不意味着没有一种。您可以在这里阅读:http : //en.wikipedia.org/wiki/Prototype-based_programming。关键是它们以与基于类的语言完全不同的方式处理OOP。这意味着概念在这两个系列之间不那么可移植。仅仅因为您了解一个家庭的OO,并不意味着您会轻松地将这些想法转移到另一家庭。

请记住,大多数编程语言都将很多想法混在一起。Python和Ruby将OOP和函数式编程思想整合到了他们的语言中。而且,您可以将基于原型的OO与对基于类的语言的某些扩展混合使用,从而使其更加复杂。


我不会将C ++计入Smalltalk系列。Smalltalk基于Simula,而Alan Kay 故意忽略了Simula-II中的大多数更改,而C ++基于此。C#很奇怪,它是由C ++用户和Pascal设计师设计的,就像Java。
约尔格W¯¯米塔格

1

OOP是编程的原则-从根本上讲是一种思想。在整个编程语言中,OOP的实现都有所不同-但是OOP的支柱(抽象,继承,封装和多态)通常以某种方式或形式存在。

我会不偏不倚地使用任何一种语言,都说Java对程序员的语义要比说Python多一点。

例如,

Java代码: class Cat extends Animal {}

从OOP的角度来看,关于您正在做的事情比:

Python代码: class Cat(Animal):

当然,它们都定义了Cat继承自Animal的类层次结构。但是我觉得对于刚开始使用OOP的程序员来说,OOP思想的应用和含义在Java中可能会更好一些,因为它可以为程序员提供帮助。


1

您明确地在问学习OOP概念最简单的语言是什么。我认为答案很明确:python

为了说明为什么会这样,让我们​​看一下Java vs Python中的典型初学者程序。让我们制作一个简单的上下猜测游戏。

爪哇

在Java中,您将编写一个Game类。

public class Game {
    public int secretNumber;
    public int tries;

    public Game(int tries, int secretNumber) {
        this.tries = tries;
        this.secretNumber = secretNumber;
    }

    public void guess(int myNumber) {
        if(myNumber > secretNumber)
            System.out.println("Your guess is too high!");
        else if (myNumber < secretNumber)
            System.out.println("Your guess is too low!");
        else
            System.out.println("You win!!");
        tries = tries - 1;
        if(tries == 0) {
            System.out.println("No more tries: you lose :(");
        }
    }

    public static void main(String[] args) {
        Game game = new Game(10, 47);
        while(true) {
            // how do I read a newline again? Something with BufferedInputStreamReader?
            // how do I convert a String to a number?
        }
    }
}

我是一个经验丰富的程序员,甚至遇到困难。此外,请查看您需要为这个简单的程序向准学生解释的内容:

  • 静态方法
  • 可见性(公共与私人)。您应该始终将字段标记为私有。
  • this. 变量被别人掩盖时引用变量的符号
  • 构造函数类似于方法,但不是方法。
  • System.out是一个outputStream。是的,这是一个领域,但这是一个static领域。
  • 有时,如果只有一条语句,则可以省略大括号
  • String[]是一个数组。这是一种特殊的对象,但实际上并非如此。
  • int是原始类型。很特别
  • 您需要很多框架方法

蟒蛇

Python非常“纯净”。没有原始类型。构造函数不存在,只有一个特殊的方法在初始化时被调用。

您无需与控制台进行交互,因为您有一个REPL。您只需使用g.guess(35)并返回一个字符串即可玩游戏。

这使语言更易于学习和掌握基本的OOP概念。


0

OOP的核心思想是将变量和方法封装(意味着捆绑或隐藏)在类内部(python绝对支持)。这是关于围绕名词设计代码的。然后从那里继续。

尽管存在实现上的差异(例如,python不像Java那样支持可见性)和语法上的差异(在Javascript中,您必须自己继承方法),但基本设计保持不变。

我确实认为,使用Java之类的语言来学习OOP会更容易,因为该语言需要它,并且社区对它的不利影响要比python社区小。

但是,关于OOP设计和实践的文章很多,而阅读它并不是白费力气。即使我写了python(很多),我也写了很多对象,并且使用了第三方库中的很多对象。


代码思想是消息传递。也没有来源。
2014年

1
OOP 与类无关
约尔格W¯¯米塔格

1
@User Alan Kay最初的想法是关于消息传递的,但是从那时起,OO的实践已经发展为按名词或对象类进行设计。例如,凯博士还认为Java不是面向对象的,因为它不支持后期绑定。@ Jorg哈哈ya ya
Rob

0

当您使用某种语言学习OOP时,您就会开始用这种语言进行思考。语言会影响您认为可以做什么以及如何完成,还会给OOP增添风味。

  • 应该有垃圾收集吗?
  • 我可以将方法添加到整数吗?
  • 我使用类还是原型?
  • 物体如何反映自己?

有些人没有课程就不能做OOP。有些人必须在此过程中杀死对象。

OOP有一个核心,也是它的原始思想。您也可以看看Smalltalk,Self,Simula,LISP,Newspeak。还要研究非OOP语言类型,例如数据流语言bash,APL和J。逻辑类型是Prolog。Haskell(类型类)。他们都会教会您不同的思维方式,您可能会学到

  • OOP与命令式语言无关
  • OOP与课程无关

最后,您可能会看到OOP有什么用。至少您会对此有另一个想法。我建议找艾伦·凯Alan Kay)谈谈


如果您不看这些语言,那么这篇文章是没有用的。

正如您在此处看到的那样:我们不同意什么是OOP。

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.