我想学习OOP。我了解Python,但对OOP知之甚少。
但是,当我在论坛上搜索“ learning OOP”时,我看到一个家伙在说:“ Python太新了,这就是为什么您不能在Python上学习OOP的原因。应该先学习Java,然后再理解Java上的OOP”。
是真的吗 在不同的编程语言上理解OOP有什么区别吗?喜欢在Java,C#,C ++,Perl或Python上学习它?
我想学习OOP。我了解Python,但对OOP知之甚少。
但是,当我在论坛上搜索“ learning OOP”时,我看到一个家伙在说:“ Python太新了,这就是为什么您不能在Python上学习OOP的原因。应该先学习Java,然后再理解Java上的OOP”。
是真的吗 在不同的编程语言上理解OOP有什么区别吗?喜欢在Java,C#,C ++,Perl或Python上学习它?
Answers:
作为理论构造的对象非常简单:它是存储数据,功能或同时存储这两者的结构。这些结构具有“自我”的感觉,这在Python之外的大多数语言中都是隐含的。这称为“描述符”,它为对象提供了一个自参考点,该点将数据(变量或字段)和函数(通常称为方法)绑定到所讨论的特定对象。这样的想法是,您专门使用的变量或方法属于该特定实例(通常在下面分配了内存),而不是某个更大,更通用的构造。
对象系统在两大类方面趋于变化:继承和访问。
有些语言(例如Java或C ++)要求您声明充当要分配的对象的“蓝图”的类。这些类及其对象一旦实例化就无法在结构上进行修改。在变量可以更改但结构是静态的意义上,它们可以覆盖其内容。例如,您不能在Java中向HashMap添加新方法。您可以扩展接口(基本上是部分实现的类,充当合同),也可以创建子类以获取所需的额外方法或变量,以及相关特定类的所有原始变量和方法。
其他基于类的语言(最经常引用的一种是Ruby)使您可以轻松打开现有类,并根据需要添加方法。这是争论的焦点,许多人认为这是非常非常危险的。
Javascript更加宽松,对象不过是变量或函数的插槽集合。只要程序员感到需要,就可以更改或覆盖它们。甚至可以将它们任意克隆为其他对象的“原型”,从而将其所有功能传递给他人。
访问控制是各种语言之间的另一个重要区别。
某些语言(例如Java)具有非常严格执行的访问修饰符,例如“私有”和“受保护”,它们精确定义了哪些类和子类可以使用给定的变量或方法。
其他诸如Python的形式较不正式,在方法或变量名称前使用下划线约定表示其私有。
最终,Python是以面向对象的方式进行编程的一种完全合法的语言,只是它没有像其他一些语言那样严格地执行它。
private
Java的封装和__
Python的下划线())是非常重要的。我认为Python的抽象级别可能会使它对初学者更具挑战性,但绝对不是不可能。Java向程序员说明了这一点,这可能会使某些概念更容易使用。
学习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
您可以就该建议的有效性得出自己的结论。
我认为您所引用的人只是在表现语言沙文主义。
实际上,OOP的概念与OOP的实现之间存在差异。从诗意上讲,一旦您对OOP的某些概念有了更好的了解,就最好理解这一点。
许多程序员仅对几种类似的语言感到满意,因此他们不必扩展自己的功能,也不必承受一段时间的能力。
所以问题归结为,Python真的会教您OOP 的概念吗?
我会说可以的,只要您有足够的学习支持,并促使您尝试在自主学习中通常不会探索的事情。最好是一本书或某种导师。Mark Lutz撰写了有关Python的非常深入,非常详尽和非常出色的书籍,我会推荐他的书籍,因为它们会促使您去做并学到更多。
您要记住的是,Python的方法不是唯一的方法,也不是唯一的正确方法。您掌握的编程范例越多,您将成为一名更好的程序员。Python进行OOP的方式并不完全是C ++或Java的方式,但是这些概念可以很好地传递。
是的,OOP实现非常不同。尽管其理论和原理是相同的,但是许多人只认为Java和C ++会执行“真正的OOP”,因此您会获得许多被认为“与语言无关”的引用,但实际上它们假定基于类的静态类型的语言。
这并不意味着这些参考文献是不好的,甚至是有限的。例如,“四人帮”(GoF)开创性著作“设计模式:可重用的面向对象软件的元素”是一个伟大作品的主要示例,当它真正表示“基于静态类的OOP”时,会说“ OOP”。
因此,我认为:是的,您可以在Python,Javascript,C和许多其他语言上学习很多OOP。但是有些人(可能是将来的雇主)在要求“ OOP经验”时表示Java / C ++ / C#。因此,也应该检查其他视图。
(而且这些不是OOP的仅有的两种“类型”。)
面向对象编程是关于如何构造编程语言以促进低耦合,信息隐藏(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与对基于类的语言的某些扩展混合使用,从而使其更加复杂。
OOP是编程的原则-从根本上讲是一种思想。在整个编程语言中,OOP的实现都有所不同-但是OOP的支柱(抽象,继承,封装和多态)通常以某种方式或形式存在。
我会不偏不倚地使用任何一种语言,都说Java对程序员的语义要比说Python多一点。
例如,
Java代码: class Cat extends Animal {}
从OOP的角度来看,关于您正在做的事情比:
Python代码: class Cat(Animal):
当然,它们都定义了Cat继承自Animal的类层次结构。但是我觉得对于刚开始使用OOP的程序员来说,OOP思想的应用和含义在Java中可能会更好一些,因为它可以为程序员提供帮助。
您明确地在问学习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概念。
OOP的核心思想是将变量和方法封装(意味着捆绑或隐藏)在类内部(python绝对支持)。这是关于围绕名词设计代码的。然后从那里继续。
尽管存在实现上的差异(例如,python不像Java那样支持可见性)和语法上的差异(在Javascript中,您必须自己继承方法),但基本设计保持不变。
我确实认为,使用Java之类的语言来学习OOP会更容易,因为该语言需要它,并且社区对它的不利影响要比python社区小。
但是,关于OOP设计和实践的文章很多,而阅读它并不是白费力气。即使我写了python(很多),我也写了很多对象,并且使用了第三方库中的很多对象。
当您使用某种语言学习OOP时,您就会开始用这种语言进行思考。语言会影响您认为可以做什么以及如何完成,还会给OOP增添风味。
有些人没有课程就不能做OOP。有些人必须在此过程中杀死对象。
OOP有一个核心,也是它的原始思想。您也可以看看Smalltalk,Self,Simula,LISP,Newspeak。还要研究非OOP语言类型,例如数据流语言bash,APL和J。逻辑类型是Prolog。Haskell(类型类)。他们都会教会您不同的思维方式,您可能会学到
最后,您可能会看到OOP有什么用。至少您会对此有另一个想法。我建议找艾伦·凯(Alan Kay)谈谈。
如果您不看这些语言,那么这篇文章是没有用的。
正如您在此处看到的那样:我们不同意什么是OOP。