十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

python学习笔记 -- 面向对象之类和对象

python学习笔记 -- 面向对象之类和对象 第8章 面向对象之类和对象8.1面向对象和面向过程8.1.1 程序设计的思路面向对象,是软件开发中的一类编程风格、开发范式。除了面向对象,还有面向过程。在所有的编程范式中,我们接触最多的还是面向过程和面向对象两种。类比:史书类型纪传体:以人物传记为中心,“本纪”叙述帝王,“世家”记叙王侯封国和特殊人物,“列传”记叙民间人物。编年体:按年、月、日顺序编写。国别体:是一部分国记事的历史散文,分载多国历史。早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来越明显,出现了面向对象思想并成为目前主流的方式。1. 面向过程的程序设计思想(Process-Oriented Programming),简称POP关注的焦点是过程:过程就是操作数据的步骤。如果某个过程的实现代码重复出现,那么就可以把这个过程抽取为一个函数。这样就可以大大简化冗余代码,便于维护。典型的语言:C语言代码结构:以函数为组织单位。是一种“执行者思维”,适合解决简单问题。扩展能力差、后期维护难度较大。2. 面向对象的程序设计思想( Object Oriented Programming),简称OOP关注的焦点是类:在计算机程序设计过程中,参照现实中事物,将事物的属性特征、行为特征抽象出来,用类来表示。典型的语言:Java、C#、C++、Python、Ruby和PHP等代码结构:以类为组织单位。每种事物都具备自己的属性和行为/功能。是一种“设计者思维”,适合解决复杂问题。代码扩展性强、可维护性高。8.1.2 由实际问题考虑如何设计程序思考1:如何开车?面向过程思想思考问题时,我们首先思考“怎么按步骤实现?”并将步骤对应成方法,一步一步,最终完成。 这个适合简单任务,不需要过多协作的情况。针对如何开车,可以列出步骤:面向过程适合简单、不需要协作的事务,重点关注如何执行。思考2:如何造车?造车太复杂,需要很多协作才能完成。此时我们思考的是“车怎么设计?”,而不是“怎么按特定步骤造车的问题”。这就是思维方式的转变,前者就是面向对象思想。所以,面向对象(Oriented-Object)思想更契合人的思维模式。用面向对象思想思考“如何设计车”:自然地,我们就会从“车由什么组成”开始思考。发现,车由如下结构组成:我们找轮胎厂完成制造轮胎的步骤,发动机厂完成制造发动机的步骤,…;这样,大家可以同时进行车的制造,最终进行组装,大大提高了效率。但是,具体到轮胎厂的一个流水线操作,仍然是有步骤的,还是离不开面向过程思维!因此,面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。但是,具体到实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路去处理。注意:我们千万不要把面向过程和面向对象对立起来。他们是相辅相成的。面向对象离不开面向过程!8.1.3 面向过程示例想象一下,你要做一顿美味的晚餐。在面向过程编程的思维下,你会把整个做饭的过程拆分成一系列的步骤。defbuy():print("去超市购买食材。")defwash():print("清洗蔬菜。")defcut():print("切菜。")defcook():print("开始烹饪。")defserve():print("上菜啦!")buy()wash()cut()cook()serve()上面就是一个典型的面向过程的程序,我们把整个做饭的过程分解成了一个个函数,每个函数完成一个特定的任务,然后按照顺序依次调用这些函数,就可以完成做晚餐的任务啦。这种方式非常直接,适合一些简单的任务,它注重的是程序的流程和步骤。但是呢,当我们的程序变得越来越复杂,会出现什么问题呢?比如说,我们现在想做不同类型的菜,有些菜可能不需要洗菜,有些菜可能不需要切菜,或者你要同时做几道菜,那我们的代码就会变得越来越长,越来越乱,而且上面的代码步骤是没有通用性的。8.1.4 面向对象示例用面向对象的思想实现上面的做菜功能。""" 面向对象编程 """classDish:def__init__(self,name):self.name=namedefprepare(self):passclassSalad(Dish):defprepare(self):print(f"为{self.name}购买食材。")print(f"清洗{self.name}的蔬菜。")print(f"切{self.name}的蔬菜。")print(f"将{self.name}装盘。")classSoup(Dish):defprepare(self):print(f"为{self.name}购买食材。")print(f"煮{self.name}。")salad=Salad("蔬菜沙拉")soup=Soup("紫菜鸡蛋汤")salad.prepare()print()soup.prepare()print()在这里,我们创建了一个 Dish 类,它就像是一个菜的模板。然后我们创建了 Salad、Soup 这些子类,它们都继承自 Dish 类。每个子类都有自己的 prepare 方法,这个方法描述了如何准备这道菜。这样,我们可以看到面向对象编程的优势啦 首先,我们把相关的数据(比如菜的名字)和操作(比如准备菜的过程)都封装在了一个类里面,这叫做 “封装”。而且,不同类型的菜可以有自己独特的准备方法,我们可以根据需要去修改或扩展这些方法,而不会影响其他类。这就像是每个菜都有自己的制作过程。还有,当我们想要添加新的菜品时,我们只需要创建一个新的子类,定义它自己的 prepare 方法就好,不需要修改原来的代码。8.1.5 面向对象编程思想的历史对象作为编程实体最早是于1960年代由Simula 67语言引入思维。Simula这一语言是奥利-约翰·达尔和克利斯登·奈加特在奥斯陆的挪威计算中心为模拟环境而设计的。(据说,他们是为了模拟船只而设计的这种语言,并且对不同船只间属性的相互影响感兴趣。他们将不同的类型船只归纳为不同的类,而每一个对象,基于它的类,可以定义它自己的属性和行为。)这种办法是分析式程序的最早概念体现。在分析式程序中,我们将真实世界的对象映射到抽象的对象,这叫做“模拟”。Simula不仅引入了“类”的概念,还应用了实例这一思想,这可能是这些概念的最早应用。8.2 类和对象人认识世界,其实就是面向对象的。比如,我们认识一下美人鱼(都没见过)经过“仔细学习”,发现美人鱼通常具备一些特征:女孩有鱼尾美丽这个总结的过程,其实是抽象化的过程。抽象出来的美人鱼的特征,可以归纳为一个美人鱼类。而图片中的都是这个类呈现出来的具体的对象。8.2.1 类和对象概述类(Class)和对象(Object)是面向对象的核心概念。1、什么是类类:具有相同特征的事物的抽象描述,是抽象的、概念上的定义。2、什么是对象对象:实际存在的该类事物的每个个体,是具体的,因而也称为实例(instance)。可以理解为:类 = 抽象概念的人;对象 = 实实在在的某个人类描述了所创建的对象共同的属性(是什么)和方法(能做什么),属性和方法统称为类的成员。类是对大量对象共性的抽象类是创建对象的模板类是客观事物在人脑中的主观反映对象是类的具体实例,拥有类定义的属性和方法。在自然界中,只要是客观存在的事物都是对象类是抽象的,对象是类的实例(Instance),是具体的。一个对象有自己的状态(属性)、行为(方法)和唯一的标识(本质上指内存中所创建的对象的地址)。8.2.2 定义类定义类的语法格式:class类名:"""类说明文档"""类体类名一般使用大驼峰命名法。类体中可以包含类属性(也叫类变量)、方法、实例属性(也叫实例变量)等。示例:定义一个人的类,包含__init__()方法、eat()方法和drink()方法。classPerson:"""人的类"""home="earth"def__init__(self):self.age=0defeat(self):print("eating...")defdrink(self):print("drinking...")8.2.3 类的操作之一:成员引用语法格式:类名.成员名示例# 获取类的成员print("类的文档说明:",Person.__doc__)print("类变量home:",Person.home)# print("实例变量age:",Person.age) # 报错,注意age前面有self,所以是实例变量,不是类变量,不能通过类名获取print("类的成员:",Person.__init__)print("类的方法:",Person.eat)# 注意eat后面没有(),否则就是调用eat方法了print("类的方法:",Person.drink)# 注意drink后面没有(),否则就是调用drink方法了类的文档说明: 人的类 类变量home: earth 类的成员: function Person.__init__ at 0x0000017C8CABB7E0 类的方法: function Person.eat at 0x0000017C8CB35B20 类的方法: function Person.drink at 0x0000017C8CB35DA08.2.4 类的操作之二:实例化创建类的对象的过程称为实例化。创建对象的语法格式:变量名=类名()变量名=类名(实参列表)示例代码:# 创建对象p=Person()# 创建一个对象print
返回列表