重新认识面向对象
一.面向对象概念理解
1.1面向对象
•面向对象的编程(OOP,Object Oriented Programming)
•早期的计算机编程是基于面向过程的方法,例如实现算术运算1+1+2 = 4,通过设计一个算法就可以解决当时的问题。随着计算机技术的不断提高,计算机被用于解决越来越复杂的问题。面向对象由此诞生用来解决那些使用面向过程很复杂的问题
1.2面向对象之重点
•对象:一切皆对象
•对象就是内存中存储指定数据的一块区域
•实际上对象就是一个容器,专门用来存一类具有相同特征但又各有特点数据
•程序运行的通俗解释:
•代码存在硬盘,CPU处理代码,CPU和硬盘之间有内存,解释器将代码交给内存,CPU再从内存读取(详细过程在此我们不深究)
1.3面向对象的结构
id(标识)
•作用:用来标识对象的唯一性,每个对象都有唯一的id,每个id指向一个内存地址值,即id是对象在内存的标识
•id由解释器生成,其实就是对象的内存地址
type(类型)
•类型决定了该对象所具有的功能(确定该对象是哪一个类的实例对象),确定完成后即可使用该类中定义的属性与方法
•可使用type()
函数来查看该对象的类型
value(值)
•值就是对象中存储的具体数据与数据结构,分为:
•不同对象可使用不同的数据结构,以提高效率
•可变对象:
•列表list、集合set、字典dict
•不可变对象:
•数值类型int、float,字符串str,元组tuple,布尔型bool
1.4从面向过程到面向对象
所谓面向对象,简单理解就是语言中所有的操作都是通过对象来进行的
面向对象和面向过程都是编程解决问题的重要思想各有优缺点
面向过程 → 面向对象:
面向过程的典型代表是C语言,是早期语言的特点,用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为
面向对象即将所需要解决的问题定义成一个整体,将一部分问题取出分部分解决
•对面向对象的理解:
1.可以让复杂事务变得简单化,人由执行者过渡到指挥者
2.具备封装、继承和多态三大特性
实例区别两种思想
以前总有人问你的一个问题:把大象关进冰箱需要几步
•面向过程:
(1)打开冰箱
(2)放入冰箱
(3)关闭冰箱
即上述所有动作都需要我们执行,自己亲自动手,当我们需要将大象放到其他地方时,你自己又需要执行其他动作。操作麻烦
这是一个典型的面向过程的例子,在现实中没问题,但是在程序中会出现问题,在复用、修改时会出现很多问题
•面向对象:
•面向对象的重点就是将大象放入冰箱,不需要知道具体咋实现,实现细节都在对象内部
面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了
两种编程思想的优缺点
•面向过程:
优点:性能比面向对象好,因为类调用时需要实例化,开销比较大,比较消耗资源。
缺点:不易维护、不易复用、不易扩展.
•面向对象:
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护 .
缺点:性能比面向过程差
二.类(class)的简介
•在没学习面向对象之前,我们所用到的对象都是Python内置的对象
•同样在编程世界里,其实我们从第一天开始就在接触类(class),比如整数、字符串、浮点数等,不同的数据类型就属于不同的类
•类简单理解就是一张图纸,在程序中我们需要根据类来创建对象
print(type('1')) # '1'属于字符串类'str'
print(type(1)) # 1属于整数类'int'
print(type([1])) # [1]属于列表类'list'
2.1实例
•在Python的术语里,我们把类的个例就叫做实例 (instance),可理解为“实际的例子”
•至此,我们已经认识了两个重要的新概念:类和实例,也知道它们之间的关系类似于:群体和个体。群体里的每个个体都有着相同/相似的特征和行为
2.2自定义类
•自己定义类时,类名要以大写开头
语法结构:
class 类名([父类]): #类名大写开头
代码块
eg:
class Dog(object):
pass
print(Dog)
打印结果为:<class ‘__ main __.Dog’>
创建实例:
class Dog(object):
pass
# 创建Dog的实例对象,(秋田)pembroke时Dog的实例对象
pembroke = Dog()
print(pembroke, type(pembroke))
打印结果:<__ main __.Dog object at 0x0000017ADB6D8348>
<class ‘__main __.Dog’>
解释理解: Pembroke是Dog的对象 内存中的地址为0x0000017ADB6D8348 type()方法只显示谁是谁的实例,不显示在内存的地址
isinstance()方法
•isinstance() 函数来判断一个对象是否是一个已知的类型
•isinstance() 与 type() 区别:
type() 不会认为子类是一种父类类型,不考虑继承关系
isinstance() 会认为子类是一种父类类型,考虑继承关系
如果要判断两个类型是否相同推荐使用 isinstance()
class Dog(object):
pass
# 用Dog创建了一个对象pembroke,pembroke是Dog的实例
pembroke = Dog()
pembroke2 = Dog()
pembroke3 = Dog()
pembroke4 = Dog()
# 用来检查一个对象是否是一个类的实例
result = isinstance(pembroke, Dog)
result2 = isinstance(pembroke2, int)
result3 = isinstance(pembroke3, type(pembroke))
result4 = isinstance(pembroke4, type(pembroke4))
print(result, result2, result3, result4)
打印结果:True False True True
简单理解:isinstance()用来检查一个对象是否是一个类的实例