1.面向对象概念
什么是面向对象
面向对象简称OOP是一种编程思想,是前辈们总结出的经验,指导程序员如何编写出更好的程序
其核心是对象,将对象作为程序的基本操作单元,程序是一系列对象的集合,程序员负责调度控制这些对象来交互的完成任务
在面向对象中程序员的角度发生了改变,从具体的操作者变成了指挥者
面向对象的优缺点及使用场景
优点:提高了扩展性。当一个对象发生改变时,对其他对象是没有任何影响的
提高了灵活性。例如游戏中,每个玩家的操作都是自由的,而不是机械般固定的!你可以买武器,也可以买护甲
提高了重用性。一个定义好的对象可以多次重复使用
缺点:程序的复杂度提高了
无法准确的预知结果
使用场景:对扩展性要求较高的程序,通常是面向用户的,比如qq,微信和一些经常更新的游戏
面向过程的优缺点及使用场景
优点:逻辑清晰,可以将复杂的问题流程化,进而简答化
缺点:扩展性差,可维护性差,一旦需要修改某个功能,会影响到全局的功能
使用场景:对扩展性要求较低的程序,如系统内核,git,计算器等一旦完成就不需要后期修改的
注意:面向对象和面向过程并没有好坏之分,要根据具体的情况区分使用哪种
2.类和对象的概念
类和对线是面向对象编程(OOP)中最核心的两个概念
类
类型、类别,是一系列具备相同特征和行为的对象的集合
对象
是具体存在的某个事物,具备具体的特征和行为,对象就是特征和技能的结合体
类包含一系列对象,对象属于某个类
在生活中是先有对象再有类,而在程序中是先有类再有对象
结论:在面向对象编程时需要先考虑我们需要创建的对象的特征和行为,再根据这些特征和行为创建对象属于的类
3.如何创建类和对象
定义类和对象的语法
1 # 定义类和对象的语法 2 class 类名: # 创建一个类 3 内部代码,可以定义他的特征和技能(行为) 4 特征用变量名表示 5 技能(行为)用函数表示 6 7 具体的对象名 = 类名() # 创建一个具体的对象
简单的创建一个类和对象
1 # 简单的创建一个类和对象 2 class Person: # 这就是一个类,虽然这个类什么都没有 3 print(123) 4 role = 'person' # 人的特征属性都是人 5 def eat(self): # 人都要吃饭,有一个吃饭的技能 6 return 'eat' 7 8 p1 = Person() # 这就是一个对象,他是根据这个类创建出来的,创建的时候会执行类中代码 9 print(p1.eat()) # 打印类中函数的返回值'eat' 10 print(p1.role) # 查看类中的属性
4.设计属性和属性的查找顺序
属性的设计
1 # 设计属性 2 class Person: # 定义一个类 3 age = 18 # 类的属性 4 pass 5 6 p1 = Person() # 生成一个对象 7 p1.name = 'sxc' # 增加对象的属性 8 print(p1.age) 9 print(p1.name) 10 11 p1.name = 'zzj' # 修改属性 12 print(p1.name) 13 14 del p1.name #删除属性 15 16 print(p1.__dict__) # 查看对象的所有属性,name的属性被删除 17 18 print(p1.__class__) # 访问对象的类的信息
属性的查找顺序
先从对象自己的属性找,找不到再去类中找。对象------>类------>父类
1 # 属性的查找顺序 2 class Person: # 定义一个类 3 age = 18 # 类的属性 4 pass 5 6 p1 = Person() # 生成一个对象 7 p1.age = 20 # 对象中的属性 8 print(p1.age) # 此时打印的是对象的属性 9 10 del p1.age #删除对象中的属性 11 print(p1.age) # 此时打印的就是类的属性了
5.初始化方法
什么是初始化方法
用于为对象的属性设置初始值的函数,__init__方法
为什么需要初始化方法
在类的实例(对象)中,一些属性是必须存在的,就可以用初始化函数来完成,如人的姓名
特点:当实例化对象时,会自动执行__init__方法,会自动将对象作为第一个参数传入。
初始化对象的属性
1 # 初始化方法 2 class Student: 3 def __init__(self,name,age,sex): # 初始化方法 4 self.name = name 5 self.age = age 6 self.sex = sex 7 8 s1 = Student('sxc', 18, 'male') 9 s2 = Student('zzj', 19, 'male') 10 print(s1.name) # 查看属性 11 print(s2.age)
注意:初始化函数不能有返回值,他只能返回None,不写return和只写return和return None都可以,但是一般默认不写
6.绑定方法之对象的绑定方法
在类中定义的函数方法默认都对象绑定方法,并且没有被任何装饰器装饰
特点:当使用对象调用该函数时会自动传入对象本身作为第一个参数
当使用类名来调用时他就是一个普通的函数,有几个参数就要传入几个参数
1 # 对象绑定方法 2 class Student: 3 def __init__(self,name,age,sex): # 初始化方法 4 self.name = name 5 self.age = age 6 self.sex = sex 7 8 def say(self): 9 print('我是%s,我的年龄是%s,我的性别是%s'%(self.name,self.age,self.sex)) 10 11 s1 = Student('sxc',18,'男') 12 s1.say() # 对象直接调用会将本身作为参数 13 14 Student.say(s1) # 类名来调用需要传入参数
7.绑定方法之类的绑定方法
用classmethod装饰器装饰的方法就是类绑定方法
特点:不管用类还是对象调用,参数的第一个必须是cls表示当前类本身,使用类名来调用,调用时会自动传入类
1 # 类绑定方法 2 class Student: 3 def __init__(self,name,age,sex): # 初始化方法 4 self.name = name 5 self.age = age 6 self.sex = sex 7 8 @classmethod 9 def say(cls,self): 10 print('我的类是%s,我是%s,我的年龄是%s,我的性别是%s'%(cls,self.name,self.age,self.sex)) 11 12 s1 = Student('sxc',18,'男') 13 s1.say(s1) # 自动传入类 14 15 Student.say(s1) # 自动传入类
8.非绑定方法(不常用)
用staticmethod装饰器装饰的方法就叫做非绑定方法,不需访问类的数据,也不需要访问对象的数据
1 # 非绑定方法 2 class Student: 3 def __init__(self,name): # 初始化方法 4 self.name = name 5 6 @staticmethod # 非绑定方法 7 def msg(): 8 print('i am a student') 9 10 s1 = Student('sxc') # 定义一个对象 11 12 Student.msg() # 类可以直接调用,不需要传参数 13 14 s1.msg() # 对象可以直接调用,不需要传参数
20