面向对象的初识
01. 面向对象与面向过程的区别:
面向过程:
面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。
优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。
缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
面向对象:
面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。
02. 什么叫对象?
对象说的不是你的女朋友...
这里的对象指的是一个具体的事物,一个在现实中客观存在的事物。他具有唯一性。
举个例子,你媳妇家隔壁老王家的泰迪犬小黑,首先你媳妇只有一个(咱们说的是正经话题),隔壁老王家的狗(可能不止一个种类,也可能是不止一条泰迪犬,但是小黑,只有一个),于是你就能确定了对象。
所以通过分析,从计算机编程中而言,识别对象的唯一性,应该是内存地址,每一个地址确定一个对象。
面向对象编程可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。
03. 类的定义
其实只要你明白了什么叫做作对象,那么类,你就会非常好理解。
类可以总结为具有相似,相同共性的对象的集合,对象则是类实例化的具体表现。
比如说,
你是一个对象,但是人是一类。
小黑是一个对象,而狗是一类。
类的结构:
class 类名(): #类名首字母大写
pass
04. 类名 操作 类
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
类属性:
class Person: #定义一个人类
role = 'person' #静态属性: 属性 静态变量 静态字段
def walk(self): #方法: 函数 动态属性
print("person is walking...")
print(Person.role) #查看人的role属性
print(Person.walk) #引用人的走路方法,注意,这里不是在调用
一:我们定义的类的属性到底存到哪里了?有两种方式查看
dir(类名):查出的是一个名字列表
类名.__dict__:查出的是一个字典,key为属性名,value为属性值
二:特殊的类属性
类名.__name__# 类的名字(字符串)
类名.__doc__# 类的文档字符串
类名.__base__# 类的第一个父类(在讲继承时会讲)
类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
类名.__dict__# 类的字典属性
类名.__module__# 类定义所在的模块
类名.__class__# 实例对应的类(仅新式类中)
05. 面向对象的结构
class 类名:
def __init__(self,参数1,参数2):
self.对象的属性1 = 参数1
self.对象的属性2 = 参数2
def 方法名(self):pass
def 方法名2(self):pass
对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西
#类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
#括号里传参数,参数不需要传self,其他与init中的形参一一对应
#结果返回一个对象
对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可
06. 实例化对象
实例化过程: 对象名 = 类名() 其实就是类——>对象的过程
实例化经历了三件事:
1.在内存中创建了一个 不知名 对象的名称空间
2.自动执行类中__init__的方法并将这个对象空间传送给self,对象名为self对应的值。
3.在__init__中通过self给这个空间添加属性,并且返回。
07. 对象操作类
1.对象.__dict__ 方法
2.对象.变量可以增删改操作
3.对象可以查询类中的属性。
4.对象可以执行类中的方法
#对象执行类中的所有方法(除去3个特殊方法) Pyhton解释器都会解释器都会将对象空间主动传给方法的第一个参数self(可以是其他名称,但是self是为了统一)
08.类的名称空间以及对象名称空间
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
而类有两种属性:静态属性和动态属性
#静态属性就是直接在类中定义的变量
#动态属性就是定义在类中的方法
那么,
创建一个对象/实例就会创建一个对象/实例的名称空间,里面放有一个类对象指针。
在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常
练习
class Message:
theme = '选秀人物信息'
def __init__(self,name,age,height,weight,role,team):
self.name = name
self.age = age
self.height = height
self.weight = weight
self.role = role
self.team = team
print(Message.__dict__)
print(Message.theme)
p1 = Message('科比', '19', '196cm', '102KG', 'SG', '湖人')
print(p1.__dict__)
print(p1.name)
print(p1.role)
print(p1.team)
p2 = Message('乔丹', '23', '198cm', '109KG', 'SG', '公牛')
print(p2)
print(p2.age)
p2.nickname = '篮球之神' #增
print(p1.nickname) #报错
print(p2.nickname)
del p2.name #删
print(p2)
p2.age = 45 #改
print(p2.age)