什么是面向对象:
它是一种编程思想,是前辈总结出来的经验,知道程序员如何更好的编写程序,
核心是对象,程序就是一系列对象的集合,程序员通过负责调度这些对象让他们交互完成任务
相对于面向流程,就像流水线一样,亲自把制作手机的流程分成很多个小步骤,一一实现
面向对象,就像找到能管理流水线的人,让他负责流水线的运作
案例: 把大象装进冰箱?
面向过程:
1.拿起大象
2.打开冰箱
3.装入大象
4.关闭冰箱
面向对象:
找到具备装大象技能的对象,装入大象
从面向过程到面向对象,程序员实现从一线流水工人到选拔流水工人的管理层进化,但要说明的是对象不是凭空产生的,需要我们自己先设计,后调用.
其它案例:
西天取经:一个对象发生变化,并不影响其它对象,拓展性
曹操吟诗:对象可以重复的使用
面向对象的优缺点:
三大优点:
1.扩展性,更方便的加入其它功能,QQ,微信
2.灵活性,可以随意的替换,西天取经
3.重用性,活字印刷相对于竹简可以重复利用,曹操吟诗
两大缺点:
1.程序的复杂性提高,需要先定义一个个对象,之后再来调用,复杂性大幅提高
2.无法准确地预知结果,打游戏你很难知道哪个英雄拿到最后的胜利点
面向过程的优缺点:
关注的核心是流程,过程就是一步步执行流程的步骤,先做什么在做什么
优点:逻辑清晰,将复杂问题进行拆解简单化\流程化
缺点:扩展性差,可维护性差
使用场景:
面向流程一般面向程序员和系统硬件的程序,执行流程比较固定,对拓展性要求较低的,系统内核,计算器等
面向对象:直接面对终端用户,用户需求不断变化,所以对拓展性要求高,方便增删改查的程序,比如QQ,微信的
根据不同的场景使用最合适的编程方式
类和对象
这个是oop(面向对象)中最核心的两个概念
类
就是类型,类别,一种抽象概念,就是一系列具有相同特征和相同行为的对象的集合
对象
就是一个实实在在的具体的某个事物,具备自己的特征和行为
对象就是特征和行为的结合体
类和对象的关系
类里面包含一系列的对象,对象属于某一个类
在生活中是先后对象后有类,而在程序中确实相反的,我们需要先定义类,然后在再定义对象,因为我们需要先告诉计算机这类的对象都有什么共同的特征和行为
总述:在使用面对对象编程时,第一步是思考需要什么样的对象,对象具备什么样的特征和技能,从而根据这些信息总结出需要的类型
创建类与对象
定义类的语法
class 类的名称:
# 类中的内容 描述属性和技能
# 描述属性用变量
# 描述技能用函数
# 类命名 书写规范 首先是见名知意 名称用大驼峰命名法
# 驼峰就是单词的首字母大写
class Student:
pass
stu = Student
print(stu) # <class '__main__.Student'>
属性可以写在类中,类中的属性,是所有对象共用的
属性也可以写在对象中,对象中的属性,是每个对象独特的(不一样的)
如果类和对象中,有同样的属性,先访问对象,如果没有再访问类
# 描述一个老师(包含,一个公共属性和一个独特属性)
class Teacher:
school = 'oldboy'
t1 = Teacher()
t1.name = 'ryan'
t1.age = 18
增加属性
对象变量名称.属性名称 = 属性值
删除属性
del 对象的变量名称.属性名称
修改
对象变量名.属性名 = 新属性值
查看属性:所有属性\类信息
print(对象.__dict__) 所有属性
print(对象.__class__) 访问类信息
print(Teacher.__dict__)
# {'__module__': '__main__', 'school': 'oldboy', '__
# dict__': <attribute '__dict__' of 'Teacher' objects>,
# '__weakref__': <attribute '__weakref__' of 'Teacher' objects>,
# '__doc__': None}
print(Teacher.__class__) # <class 'type'>
class Dog:
def __init__(self, kind, color, age):
self.kind = kind
self.color = color
self.age = age
d1 = Dog('牧羊犬', '黄白', '2')
d2 = Dog('哈士奇', '黑白', '1')
d3 = Dog('泰迪犬', '棕黄', '1')
# 注意:这个函数不能有任何返回值,只能是None,规定如此..
class Student:
school = "oldboy"
def __init__(self, name):
self.name = name
def say_hi(self):
print(f'hi,my name is {self.name}.')
stu = Student('ryan')
stu.say_hi() # hi,my name is ryan.
非绑定方法不重要
7.绑定方法与非绑定方法
6.初始化方法
5.属性的查找顺序
4.如何设计属性
3.如何创建类和对象
2.类和对象的概念
对比,面向过程的优缺点 以及使用场景
1.面向对象的概念
get是从文件中获取对象
save是将对象存储到文件中
例子:为学生类添加一个save方法 一个get方法
一般不常用,不如直接在外面定义一个函数
语法:@staticmethod
或者叫做静态方法,就是不需要类和对象的数据时
非绑定方法
函数逻辑需要访问对象或者类中的数据时,就绑定给对象或者类
特殊之处:不管用类还是对象调用,都会自动传入类本身,作为第一个参数
类绑定方法用@classmethod来装饰
类的绑定方法
而使用类名来调用,它就是一个普通函数,有几个参数传递就得传几个
使用对象调用该函数时,会自动传入对象本身,作为第一个参数
默认的类中使用的方法都是对象的绑定方法,特殊的地方就是:
对象的绑定方法
对象的精髓就在于将获取数据的变量名和处理数据的函数功能融合在一起,所以我们通过一个对象就获得数据并处理数据.
案例:狗的类别
功能:用户给对象赋初始值
特点2:会自动将对象作为第一个参数传入,参数名称为self(附:我们可以吧self改成其他名字,但是不建议改)
特点1:当实例化对象时,会自动执行init方法
init叫做初始化方法,本质也是一个函数
init方法
属性的增删改查
属性的写法
创建对象的语法