面向过程编程与面向对象编程对比:
(1)面向过程编程:
核心是过程二字,过程指的是解决问题的步骤,即想干什么再干什么后干什么。。。
基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维方式
优点:
复杂的问题流程化、进而简单化
缺点:
可扩展性差
(2)面向对象编程:
核心是对象二字,对象是特征与技能的结合体
面向对象编程:我们关注的点是.使用什么样的对象可以完成我的任务
优势: 1.对于指挥者(程序员)来说,不需要再关心具体步骤
2.扩展性,一个单独的个体的特征或行为发生变化时 不会影响到别人
缺点: 1.程序的复杂度变高,你得需要设计这个些对象,注意要避免过度设计得问题
2.程序得执行结果可控性低
一、定义
(1)什么是对象、类
对象是特征与技能的结合体,类就是一系列对象相似的特征与技能的结合体
站在不同的角度,总结出的类是截然不同的
(2)为什么用对象、类
在现实世界中一定是先有的一个个具体存在的对象,然后随着人类文明地发展而总结出了不同的类
在程序中务必保证先定义类,后调用类来产生对象
(3)对象、类产生过程
现实世界中总结对象-----》抽取相似之处,得到现实世界中的类---》定义为程序中的类-----》调用类,产生程序中的对象
站在老男孩选课系统的角度: 现实世界中的老男孩学生对象: 对象1: 特征: 学校='oldboy' 姓名='耗哥' 年龄=18 性别='male' 技能: 选课 站在老男孩选课系统的角度,先总结现实世界中的老男孩学生类 老男孩学生类: 相似的特征: 学校='oldboy' 相似的技能 选课
二、基本操作
#1、先定义类
class OldboyStudent: #驼峰体
school='oldboy'
def choose_course(self):
print('is choosing course')
# 在定义阶段
# 只要包含该类的py被执行 就会做两件事情
# 1.就会创建类的名称空间
# 2.执行代码 将产生的名称放入名称空间
# print(OldboyStudent.__dict__)
# 类本质就是一个名称空间/容器,从类的名称空间中增/删/改/查名字
# python为我们提供专门访问属性(名称空间中的名字)的语法,点后的都是属性
OldboyStudent.school #OldboyStudent.__dict__['school']
OldboyStudent.x=1 #OldboyStudent.__dict__['x']=1
OldboyStudent.school='Oldboy' #OldboyStudent.__dict__['school']='Oldboy'
del OldboyStudent.x #del OldboyStudent.__dict__['x']
# 类中定义的函数是类的函数属性,类可以使用,但使用的就是一个普通的函数而已,意味着需要完全遵循函数的参数规则,该传几个值就传几个
# OldboyStudent.choose_course(123)
#2、后调用类产生对象,调用类的过程称之为实例化,实例化的结果称为类的一个实例或者对象
stu1=OldboyStudent() # print(stu1)
stu2=OldboyStudent() # print(stu1)
stu3=OldboyStudent() # print(stu3)
对象本质也就是一个名称空间而已,对象名称空间是用存放对象自己独有的名字/属性,而类中存放的是对象们共有的属性
三、绑定方法__init__
1、定义
绑定方法是什么?
# 是对象与类中的某个函数的绑定关系像生活中 我们都会吃饭 我吃饭你不会饱那么吃饭就是我自己的绑定方法
2、为什么要绑定 因为对象的行为 通常都需要访问这个对象的数据 或是修改这个对象的数据 如果没有对象
直接调用函数是没有意义的 在函数中访问不到对象的数据 所以将对象和函数进行绑定
3特殊之处
# 在使用绑定方法时 不需要关心self参数 会自动将这个对象本身传进来
# 对象调用绑定方法时 最后执行的还是类中的那个函数
class OldboyStudent:
school='oldboy'
def __init__(self, x, y, z): #会在调用类时自动触发
self.name = x #stu1.name='耗哥'
self.age = y #stu1.age=18
self.sex = z #stu1.sex='male'
def choose_course(self,x):
print('%s is choosing course' %self.name)
def func(self):
pass
__init__方法详解
class OldboyStudent: # school='oldboy' # # # def __init__(obj, x, y, z): #会在调用类时自动触发 # obj.name = x #stu1.name='耗哥' # obj.age = y #stu1.age=18 # obj.sex = z #stu1.sex='male' # # def choose_course(self): # print('is choosing course')
1、调用类时发生两件事
#1、创造一个空对象stu1
#2、自动触发类中__init__功能的执行,将stu1以及调用类括号内的参数一同传入
# stu1=OldboyStudent('耗哥',18,'male') #OldboyStudent.__init__(stu1,'耗哥',18,'male') # stu2=OldboyStudent('猪哥',17,'male') # stu3=OldboyStudent('帅翔',19,'female')
__init__本质是个功能函数
2、属性查找
先从对象自己的名称空间找,没有则去类中找,如果类也没有则报错
1# 类名称空间中定义的数据属性和函数属性都是共享给所有对象用的
# 对象名称空间中定义的只有数据属性,而且是对象所独有的数据属性
2# 类中定义的函数是类的函数属性,类可以使用,但使用的就是一个普通的函数而已,意味着需要完全遵循函数的参数规则,该传几个值就传几个
# print(OldboyStudent.choose_course)
# OldboyStudent.choose_course(123)
3# 类中定义的函数是共享给所有对象的,对象也可以使用,而且是绑定给对象用的,
#绑定的效果:绑定给谁,就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入
# print(id(stu1.choose_course))
# print(id(stu2.choose_course))
# print(id(stu3.choose_course))
# print(id(OldboyStudent.choose_course))
PS:
补充:类中定义的函数,类确实可以使用,但其实类定义的函数大多情况下都是绑定给对象用的,所以在类中定义的函数都应该自带一个参数self