面向对象编程思想 OOP
什么是面向对象:
面向对象是一种编程思想,是前辈们总结出的经验,指导程序员如何编写出更好的程序 ,核心是对象,程序就是一系列对象的集合, 程序员负责调度控制这些对象来交互着完成任务:面向过程的程序设计:重点是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式。在面向对象中程序员的角度发生改变,从具体的操作者变成了指挥者;面向对象的程序设计并不是全部。对于一个软件质量来说,面向对象的程序设计只是用来解决扩展性。对象不是凭空产生的,需要我们自己设计;
面向对象的三大优点:
1.扩展性:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
2.灵活性:复杂度的问题流程化,进而简单化,一个复杂的问题,分成一个个小的步骤去实现,实现小的步骤将会非常简单。
3.重用性:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可
缺点:
1.程序的复杂度提高了:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
2.无法准确预知结果:无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法准确地预测最终结果。于是我们经常看到对战类游戏,新增一个游戏人物,在对战的过程中极容易出现阴霸的技能,一刀砍死3个人,这种情况是无法准确预知的,只有对象之间交互才能准确地知道最终的结果。
使用场景
对扩展性要求较高的程序 ,通常是直接面向 用户的,例如:qq,微信
面向过程编程思想:
关注的核心是过程,过程是就是一步一步的执行步骤,既先干啥在干啥
优点:逻辑清晰 , 复杂问题简单化,流程化
缺点: 扩展性差,可维护性差
类和对象:这是OOP中的最核心的两个概念。
类:
既类型,类别 ,是一种抽象概念,是面向对象设计最重要的概念,对象是特征与技能的结合体是一系列具备相同特征和相同行为的对象的集合,就是具体存在的某个事物,具备自己的特征和行为,对象就是特征和技能的结合体类和对象的关系:类包含一系列对象,对象属于某个类,在生活中是先有对象再有类。
类的数据属性是所有对象共享的
类的函数属性是绑定给对象用的
类中定义的函数(没有被任何装饰器装饰的)是类的函数属性,
类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数对象。
而在程序中是先有类才能有对象,我们必须先告诉计算机这类的对象有什么特征有什么行为
总结出一个结论:在使用面向对象编程时,第一步就是思考需要什么样的对象,对象具备什么样的特征和行为,从而根据 这些信息总结出需要的类型
创建类和对象定义类的语法:
类名称书写规范: 首先是见名知意 名称是大驼峰命名法
驼峰就是单词首字母大写 , 大驼峰是第一个字母大写,小驼峰是第一个字母小写
class 类的名称:
# 类中的内容 描述属性和技能
#描述属性用变量
#描述行为用函数
#创建对象的语法:
class Person:
pass
#创建对象
p = Person()
"""
属性的写法:
属性可以写在类中
类中的属性,是所有对象公共的
也可以写在对象中
对象中的属性,是每个对象独特的(不一样的)
如果类中和对象中存在同样的属性,先访问对象 如果没有在访问类
"""
属性的增删改查 :
"""
增加属性
对象变量名称.属性名称 = 属性值
删除属性
del 对象的变量名称.属性名称
修改
对象.属性 = 新的值
"""
# 查看属性 访问的是对象的所有属性
print(对象.__dict__)
# 访问对象的类信息
print(对象.__class__)
"""
__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 规定如此..
"""
对象的精髓就是讲数据和处理数据的函数整合到一起 ,
这样一来拿到一个对象就同时拿到了需要处理的数据以及处理数据的函数。
"""
对象的绑定方法:
"""
默认情况下类中的方法都是对象绑定方法
其特殊之处在于:
当使用对象调用该函数时会自动传入对象本身,作为第一个参数;
当使用类名来调用时他就是一个普通函数,有几个参数就得传几个参数 。
"""
# 比如写一个学生类,具备一个打招呼的技能 要能输出自己的名字信息
```python
class Student:
def __init__(self,name):
self.name = name
def say_hi(self):
print("hello my name is %s" % self.name)
类绑定方法:
类绑定方法用@classmethod来装饰
特殊之处:不管用类还是对象调用,都会自动传入类本身,作为第一个参数
什么时候绑定给对象:当函数逻辑需要访问对象中的数据时
什么时候绑定给类:当函数逻辑需要访问类中的数据时
非绑定方法:
非绑定方也可以叫做静态方法,就是即不需访问类的数据,.也不需要访问对象的数据
语法:@staticmethod 不常用。
class OldBoyStudent:
school = "oldboy"
def __init__(self,name):
self.name = name
@classmethod
def show_school(cls):
# print(self.school)
print(cls)
@staticmethod
def print_hello():
print("hello world")
stu = OldBoyStudent("jack")
OldBoyStudent.print_hello()
stu.print_hello()
# 输出为:
hello world
hello world