Day20 面向对象基础

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()  # 对象可以直接调用,不需要传参数

猜你喜欢

转载自www.cnblogs.com/sxchen/p/11241339.html