一:面向对象编程的由来
面向对象编程是一种编程思想
面向过程编程的思想,面向过程的核心是过程二字,过程即解决问题的步骤,先干什么,再干什么,,是一种机械式的思维方式。
从面向过程编程思想上可以发现,一旦项目要求快速迭代,随时扩展,那么面向过程编程就会非常吃力,所以在面对有扩展需求的项目时,就需要面向对象的程序设计思想了。
面向对象,核心是对象二字,那么对象是什么呢?
对象:技能和特征的结合体
面向对象更注重于对现实世界的模拟,是一种上帝式的思维方式。
面向对象程序设计
优点:把复杂问题流程化,继而简单化;解决的程序的扩展性问题,对某一个参数修改,会很快的反应到程序中去。
缺点:编程复杂度高,很难预测问题的精准处理结果;扩展性极差,牵一发而动全身,更改一个组件,这个流水线都要更改。
面向对象程序设计应用场景:需求经常变化的软件,互联网应用,游戏等。
二:类与对象
类即类别、种类,是面向对象设计最重要的概念,对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体,那么问题来了,先有的一个个具体存在的对象(比如一个具体存在的人),还是先有的人类这个概念,这个问题需要分两种情况去看。
在现实世界中:先有对象,再有类
在程序中:务必保证先定义类,后产生对象
在程序中特征用变量标识,技能用函数标识;因而类中最常见的无非是:变量和函数的定义。
程序中的类
class Student: school = 'xxx' def learn(self): print('is talking') def eat(self): print('is eating') def sleep(self): print('is sleeping')
注意:
1:类中可以有任意python代码,这些代码在类定义阶段便会执行,因而会产生新的名称空间,用来存放类的变量名与函数名,可以通过OldboyTecher.__dict__查看。
2:对于经典类来说我们可以通过该字典操作类名称空间的名字(新式类有限制),但python为我们提供专门的.语法;点是访问属性的语法,类中定义的名字,都是类的属性
程序中类的用法
.:专门用来访问属性,本质操作的就是__dict__ Student.school # 等于经典类的操作Student.__dict__['school'] Student.school = 'xxx' # 等于经典类的操作Student.__dict__['school']='xxx' Student.x = 1 # 等于经典类的操作Student.__dict__['x']=1 del Student.x # 等于经典类的操作Student.__dict__.pop('x')
程序中的对象
#调用类,或称为实例化,得到对象 s1 = Student() s2 = Student() s3 = Student()
如此,s1、s2、s3都一样了,而这三者除了相似的属性之外还各种不同的属性,这就用到了__init__。
注意:__init__方法是在对象产生之后才会执行,只用来为对象进行初始化操作,可以有任意代码,但一定不能有返回值
class Student: ...... def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex ...... s1 = Student('小刘', '男', 18) # 先调用类产生空对象s1,然后调用Student.__init__(s1,'lxx','男',18) s2 = Student('小明', '男', 30) s3 = Student('小李', '男', 18)
程序中对象的用法
# 执行__init__,s1.name='lxx',很明显也会产生对象的名称空间 s2.__dict__ {'name': '小明', 'age': '男', 'sex': 30} s2.name # s2.__dict__['name'] s2.name = '小明' # s2.__dict__['name']='小明' s2.course = 'python' # s2.__dict__['course']='python' del s2.course # s2.__dict__.pop('course')