面向对象OOP
一.什么是面向过程编程?
面向对象的程序设计:核心是 过程 二字,过程就是解决问题的步骤,先干什么然后干什么......就好比一条精心设计好了的流水线,是一种机械化的思维模式.
主要优点:把复杂的问题流程化,进而简单化(一个复杂的问题,分成一个个小的步骤,实现小的步骤会非常简单)
主要的缺点:可扩展性差 牵一发而动全身.
应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等
二.什么是面向对象
python中 万物皆对象 但是什么是对象呢?
面向对象核心二字 对象 是特征与技能的结合体,基于面向对象设计程序就好比创造一个世界,你就是世界的上帝,存在的都是对象,不存在的都可以创造出来. 他与面向编程有着鲜明的对比 面向对象更加注重对现实世界的模拟,是一种“上帝式”的思维方式。
主要的优点:1.可扩展性 2.灵活性 3.重用性
主要的缺点:1,.程序的复杂度提高 2. 无法准确预知结果
使用场景:对扩展性要求较高的程序,通常直接面向的用户的,例如qq 微信 游戏
需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方
三.类与对象(OOP中最核心的两个概念)
什么是类,什么是对象?
类即类别、种类,一种抽象的概念,是面向对象设计最重要的概念,对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体
类与对象的关系
类包含一系列对象 对象属于某个类
在生活中是先有对象然后在有的类 在程序中是先有类然后再有对象的 我们必须告诉计算机这类的对象有什么特征有什么行为
#在程序中先有的类然后才有的对象
1 在程序中特征用变量表示 技能用函数表示
2 类中最常见的无非是 变量和函数的定义
#程序中的类
class Student():
print('我就是龙绍进')
school = 'oldboy'
def __init__(sefl, name, age):
self.name = name
self.age = age
def hello():
print('hello', self.name)
res = Studengt() # 这相当与类的定义了
1#注意 在类中可以有任何的python代码 但是这些代码会在定义阶段便会执行 好比说定义了res 就相当执行了 会直接打印 '我是龙绍进' 同是 也会执行def __init__这个函数
2#因为执行了 所以会产生新的名称空间 用来存放变量名和函数名 可以通过__dict__ 来查看
3# 对于经典类来说我们可以通过该字典操作类名称空间的名字(新式类有限制),但python为我们提供专门的.语法
4.#点是访问属性的语法,类中定义的名字,都是类的属性
创建类和对象
定义类的语法和创建对象的语法
class 类的名称:
#类中的内容 描述属性和技能
#描述属性的变量
#描述行为的函数
#注意!!类名开头大写 多个单词用驼峰体 且见名知意
#创建对象的语法
p = 类名称()
属性的写法
#属性可以写在类中 类中的属性是公共的
#也可以写在对象中,但是对象中的属性是每一个对象独特的(不一样的)
#如果类中 和 对象存在同样的属性,先访问对象,如果没有在访问类)
练习 描述一个老师类 需要包括一个公共属性 和一个独特的属性
class Teacher:
school = 'oldboy' #公共属性
res = Teacher
res.name = '龙哥' #独特的属性
属性的添改查
增加属性
对象变量名称.属性名称 = 属性值
删除属性
del 对象的变量名称.属性名称
修改
对象.属性 = 新的值
查看属性 访问的是对象的所有属性
print(对象.__dict__)
访问对象的类信息
print(对象.__class__)
#程序中类的用法
.:专门用来访问属性,本质操作的就是__dict__
OldboyStudent.school #等于经典类的操作OldboyStudent.__dict__['school']
OldboyStudent.school='Oldboy' #等于经典类的操作OldboyStudent.__dict__['school']='Oldboy'
OldboyStudent.x=1 #等于经典类的操作OldboyStudent.__dict__['x']=1
del OldboyStudent.x #等于经典类的操作OldboyStudent.__dict__.pop('x')
init方法
叫做初始化方法,本质上就是一个函数
特点1.当实例化对象的时候,就会自动执行init方法(调用类,或称为实例化,得到对象)
特点2 会自将对象 作为第一个参数传入,参数名为 self self也可以是其他的名字 但是不建议改
功能:用户给对象赋初始值
练习:创建一个类具备几个属性,通过初始化方法来给他设置属性
class Dog:
def __init__(self,kind,color,age):
self.kind = kind
self.color = color
self.age = age
d1 = Dog("二哈","黑白",1)
d1 = Dog("泰迪","棕色",2)
注意:该函数不能有任何返回值/.... 只能是None 规定如此..
对象的精髓就是将数据和处理数据的函数整合到一起,这样一来拿到一个对象就可以同是拿到了需要处理的数据以及处理数据的函数
对象的绑定方法
默认情况下类的绑定方法都是对象的绑定方法
其特殊之处在与 当使用对象函数时会自动传入对象的本身,作为第一个参数
当使用类名来调用时他就是一个普通的函数,有几个参数就传几个参数
类绑定方法
类绑定方法用@classmethod来装饰
特殊之处:不管用类还是对象调用,都会自动传入类本身,作为第一个参数
什么时候绑定给对象:当函数逻辑需要访问对象中的数据时
什么时候绑定给类:当函数逻辑需要访问类中的数据时
非绑定方法
或叫做静态方法,就是即不需访问类的数据,.也不需要访问对象的数据
语法:@staticmethod