Day 20
前言:
面向过程编程
核心是过程二字,过程是解决问题的步骤,即先干啥再干啥后干啥
基于该思想写程序就是在设计一条条的流水线
优点:复杂的问题流程化、进而简单化
缺点:扩展性差
面向对象编程
核心是对象二字,对象是一个用来盛放数据与功能的容器
基于该思想写程序就是在整合程序
优点:可扩展性强
缺点:编程的复杂度高
1 对象是单个事物的抽象
2 对象是一个容器,封装了属性和方法(数据或者功能的集合)
在面向对象程序开发的思想中,每一个对象都是功能的中心,具有明确的分工,可以完成接受信息处理数据、发出信息等任务因此,面向对象编程具有灵活、代码可复用、高度模块化等特点,容易维护和开发,比起由一系列函数或指令组成的传统的过程式编程(procedural programming),更适合多人合作的大型软件项目。
面向对象与面向过程:
- 面向过程就是亲力亲为,事无巨细,面面俱到,步步紧跟,有条不紊
- 面向对象就是找一个对象,指挥得结果
- 面向对象将执行者转变成指挥者
- 面向对象不是面向过程的替代,而是面向过程的封装
面向对象的特性:
- 封装性
- 继承性
- [多态性]抽象
一、如何基于面向对象的思想编写程序
在 Python 中,所有数据类型都可以视为对象,当然也可以自定义对象。
自定义的对象数据类型就是面向对象中的类( Class )的概念。
我们以字典来做个栗子
def student_info(student): # 定义函数的方法
print(f"""
姓名:{student["name"]}
年龄:{student["age"]}
成绩:{student["score"]}
""")
student1 = {'school':"外比巴卜", 'name': "张三", 'age': 18, 'score': 77, 'info': student_info} # 字典接受信息
student2 = {'school':"外比巴卜",'name': "罗志祥", 'age': 38, 'score': 59, 'info': student_info}
student1['info'](student1) #调用方法
student2['info'](student2)
我们发现其中有许多相同的数据对吧,比如说school
还有 student_info
这个方法,那我们可以找一个容器来接收这两个数据吗?其实是有的python给我们定义了类( Class )的概念,下面尝试用类来将代码完善下!
class Student: # 接受参数与方法
school = "外比巴卜"
def choose(self):
print("正在选课!")
stu1 = Student() # stu1是类的实例化对象拥有属性和方法
stu2 = Student()
stu3 = Student()
print(stu1.school) # 查看与类绑定的属性
stu1.choose() # 查看与类绑定的方法
--------------------------------
>>> 外比巴卜
正在选课!
二、类和对象的关系
上面这个例子我们已经初步了解到了类与对象的关系,简单来说
类
是模板,对象
是根据类
这个模板创建出来的,应该先有类,再有对象类
只有一个,而对象
可以有很多个不同的对象
之间属性
可能会各不相同类
中定义了什么属性和方法
,对象
中就有什么属性和方法
那么他们在内存中的顺序是什么样的呢?
上面的代码扩展性还是不够好对吧,如果我们要给对象添加更多的属性比如说,姓名,年龄,成绩等…我们需要不停地重复赋值
那么有没有简单地方法可以多次赋值呢?
"""stu1.name = "张三"
stu2.name = "李四"
..........."""
def init(obj, name, age, score): 将赋值方法封装成函数就可以减少代码的冗余了
obj.name = name
obj.age = age
obj.score = score
stu1 = Student()
init(stu1, "张三", 18, 87)
print(stu1.__dict__) # 对象与类的本质实际上就是字典
--------------------------------
>>> {'name': '张三', 'age': 18, 'score': 87}
三、绑定方法
类中定义的函数是绑定给所有对象用的,绑定给谁就应该由哪个对象来调用对象.绑定方法()
会把对象当作第一个参数传入类.函数()
就是一个函数的玩法,没有自动传参的效果
那上面的init
来举例现在我们将它写进类中
class Student:
school = "外比巴卜"
def init(obj, name, age, score):
obj.name = name
obj.age = age
obj.score = score
def choose(self):
print("正在选课!", self)
stu1 = Student()
stu1.init("张三", 18, 87)
stu1.choose()
print(stu1)
print(stu1.__dict__)
--------------------------------
>>> 正在选课! <__main__.Student object at 0x0000015BE1D0DC88>
<__main__.Student object at 0x000001EDAAC2EC50>
{'name': '张三', 'age': 18, 'score': 87}
四、初始化方法
在创建类时我们有一个为对象创建初始值的方法
这个初始化方法 就是 __init__
方法,__init__
是对象的内置方法,是专门用来定义一个类具有哪些属性的方法!该方法在创建对象时会被自动调用。
class Student:
school = "外比巴卜"
def __init__(self, name, age, score):
obj.name = name
obj.age = age
obj.score = score
def choose(self):
print("正在选课!", self)
stu1 = Student("张三", 18, 87) #实例化对象赋予属性
print(stu1.__dict__)
--------------------------------
>>> {'name': '张三', 'age': 18, 'score': 87}
作用与上面的 init
方法是一样的,但是使用起来更方便,好处也更多。明天详解。