面向对象编程
面向对象编程
以下是摘自1994年《滚石》杂志对苹果公司联合创始人史蒂夫·乔布斯的采访,他在采访中解释了什么是面向对象编程。[2]
杰夫Goodell您能简单地解释一下什么是面向对象的软件吗?
史蒂夫•乔布斯物体就像人一样。它们是活的,会呼吸的东西,它们体内有知识,知道如何做事,它们体内有记忆,所以它们可以记住事情。而不是在一个非常低的层次上与它们交互,你在一个非常高的抽象层次上与它们交互,就像我们在这里所做的。
举个例子:如果我是你的洗衣对象,你可以把你的脏衣服给我,并给我发一条信息说:“你能帮我把衣服洗了吗?”我刚好知道旧金山最好的洗衣店在哪里。而且我会说英语,我口袋里有钱。所以我出去叫了一辆出租车,让司机带我去旧金山的这个地方。我去把你的衣服洗了,我跳回出租车,回到这里。我把你的干净衣服给你,说:“这是你的干净衣服。”
你不知道我是怎么做到的。你根本不知道洗衣店。也许你会说法语,但你甚至不会叫出租车。你买不起,你口袋里没有钱。但我知道如何做到这一切。你不需要知道这些。所有的复杂性都隐藏在我的内心,我们能够在一个非常高的抽象层次上进行交互。这就是对象。它们封装了复杂性,并且该复杂性的接口是高级的。
正如乔布斯解释的那样,面向对象编程允许程序员使用其他程序员编写的代码,而不必知道代码的所有细节。对于编写大型软件和制作基于软件的产品(如搜索引擎、应用程序、社交媒体网站等)来说,这是一个至关重要的功能。面向对象代码本质上在程序和计算机之间建立了一个协议:“如果你给我这些输入,我就给你这个输出。”这使得模块化和协作性编程。
值得注意的是,使用OOP是完全可选的,大多数程序都可以不使用它编写。程序员只需使用函数和变量就可以做很多事情。使用OOP的主要优点是它是一种非常有用的组织代码的方法,特别是对于非常大的项目。
面向对象编程使用的编程方法与函数式编程。
面向对象程序设计的特点
有几个面向对象编程所依赖的特性。
变量或属性:属性是对象的特征。它们作为参数传递给对象。例如,如果有车
对象,它可能具有诸如颜色
和速度
。
方法/步骤方法相当于面向对象程序设计中的函数。例如,车
上面提到的物体可能有改变速度的方法,加速
。
对象是类的实例。对象可以彼此交互,而不必知道其内部代码的所有细节。同一个类的多个实例可以同时存在,这意味着同一个类可以有多个对象。
类:创建对象(特定的数据结构)、提供状态(成员变量)的初始值和实现行为(成员函数/方法)的蓝图。
继承继承描述了基例的属性如何被派生类继承。子类继承父类的属性和方法。
封装封装是指将属性和方法存储在单个类中。提供与对象交互的公共接口,同时在对象内部隐藏其他信息的过程。封装意味着对象的内部表示通常对对象定义之外的视图是隐藏的。的main way that encapsulation helps reduce rippling effects of change is by keeping as many of the implementation details private to the class. By limiting the interface only to those members needed to use the class, many changes can be made to the implementation without affecting any code that uses the class. The class can be thought of as a 'capsule' or container for data and operations.
面向对象程序设计的直觉
很多时候,通过现实世界的例子来解释面向对象编程是最容易的。本节将把上一节中描述的OOP的许多关键组件结合在一起。有关这些组件的更深入、逐步的解释,请参阅相应的wiki页面。
快速检查:
方法和属性可能看起来有点奇怪,但是如果您使用过Python列表或字符串,那么您可能已经与与这些数据类型相关的方法进行了交互。
方法
例如,在Python中向列表中添加一些东西,
1 2 3 4一个=[1,2,3.]一个。附加(4)打印一个#输出(1、2、3、4)
的
附加
是Python中列表中的一个方法。属性
在Python中,
datetime
模块包含属性的示例。一个datetime
对象有几条与之相关的信息,用户可以提取这些信息。例如,要从datetime对象获取日期,用户可以调用datetime.day
要获得年份,用户可以打电话datetime.year
等等......日和年是datetime对象的属性。
1 2datetime。datetime。一年<属性“年”的“datetime.date”对象>
让我们来看一个关于电子游戏中的超级英雄的面向对象编程的例子。在这款游戏中,玩家控制一个拥有特定属性(属性)的超级英雄,每个超级英雄可以执行或受到各种行动(方法)的影响。
在本例中,对象或实例每个超级英雄都是由课堂描述的吗超级英雄
。可以有钢铁侠对象、神奇女侠对象、蝙蝠侠对象或蜘蛛侠对象。类超级英雄
将某些属性和方法与超级英雄对象关联。在这个例子中,每个超级英雄都有以下属性:力量、超能力、服装颜色、秘密身份、点数和生命值。此外,每个超级英雄都有以下方法(或行动):攻击和治疗。
该类允许用户创建任意数量的英雄实例——用户可以添加一个具有适合超人的独特属性的超人实例,并且超人角色将能够执行与其他超级英雄实例相同的动作。
基本上,这个类设置了一个模板,以便根据用户的需要创建尽可能多的类实例,这样每个实例的行为都相同(因为它们是相同类型的数据类型),并且具有与之关联的相同特征(尽管可能具有不同的值)。
每个英雄的属性都是初始化的,随着游戏的进行,其中一些属性可能会受到方法的影响。比如,如果蝙蝠侠被攻击了is_attacked
对他施法,他失去了健康。
下面是这个类的Python实现,以及如何创建超级英雄对象。
首先,需要初始化类,并定义属性和方法。然后,在创建超级英雄类的各个实例时,必须初始化每个英雄的属性。
1 2 3 4 5 6 7 8 9 |
|
下面是如何创建蝙蝠侠
对象
1 |
|
程序员可以定义与类相关的方法。为超级英雄
类,我们来定义gets_attacked
治愈
和gain_points
。
is_attacked
会在英雄受到攻击时被召唤,从而失去生命值治愈
会恢复英雄的生命值吗gain_points
将增加一个英雄的点数。
总的来说,这个类是这样的:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
为什么使用面向对象编程?
面向对象编程为创建程序提供了清晰的模块化结构。它使用抽象来隐藏实现细节,以便用户和其他程序员可以使用代码而不会被细节所拖累——所有重要的是代码接受给定的输入并输出商定的输出。使用类结构很容易维护和修改现有代码。易于调整的代码使面向对象代码成为制作软件库的好方法,因为软件可以很容易地操作以满足给定程序员的需求。[4]
一些人声称,面向对象的代码需要更长的编译时间,而且面向对象的编程有时会变得复杂。由于许多实现细节对可能共享您的代码的用户和其他程序员是隐藏的,因此使您的对象和类尽可能清晰和直观是很重要的。
另请参阅
参考文献
- , m。CPT-Object-Var-Proc。检索自2016年6月13日https://en.wikibooks.org/wiki/File:CPT-Object-Var-Proc.svg
- 古德,J。1994年的史蒂夫·乔布斯:《滚石》采访。检索自2016年6月12日http://www.rollingstone.com/culture/news/steve-jobs-in-1994-the-rolling-stone-interview-20110117
- , P。CPT-OOP-interfaces。检索自2016年6月13日https://en.wikibooks.org/wiki/File:CPT-OOP-interfaces.svg
- ,年代。面向对象编程概念。检索自2016年6月14日http://www.codeproject.com/Articles/27775/Object-Oriented-Programming-Concepts