一、基本概念
01、面向对象的基本概念
面向对象和面向过程是不同的编程方法
1.1过程和函数
- 过程类似于函数,可以执行但是没有返回值
- 函数可以执行也有返回值
1.2 面向过程和面向对象
1)面向过程
- 是把需要实现的需求分解成完成的步骤,一步一步从头到尾的来实现
- 根据需求,将独立的功能封装成不同的函数
- 一步一步的调用各个函数,以实现需求
面向过程的特点
- 面向过程只注重每一步的步骤,如何实现,不注重职责的分工
- 如果需求复杂,按照面向过程编写的代码也会变得很复杂
- 开发大型项目,会比较困难
2)面向对象
- 面向对象是更加复杂的封装
- 对完成某个需求前,确定职责即需要做的事(方法)
- 根据职责确定不同的对象,在对象内部封装不同的方法
- 将不同的功能封装在独立的对象中,再由对象调用方法
特点:
- 面向对象注重的是职责的分配,将不同的方法封装在不同的对象中
- 适合比较复杂的项目,有固定的套路
eg:面向对象就是将不同的功能分配在一个个实体中,只要将实体放在大的程序框架中,实体负责实现自己的职责就好,例如植物大战僵尸中的向日葵就是一个对象,将向日葵需要做的职责:生产阳光、摇晃,以及拥有的生命值的属性,封装在他的内部,只要将向日葵放在地上,他就会执行自己的职责,同理,僵尸豌豆射手也有自己的属性和职责,将他们放在一起各自执行自己的职责就可以让整个游戏顺利的进行下去。
二、类和对象
01、基本概念
1.1类
类是对一群具有相同特征(属性)和行为(方法)的事物的统称,是抽象的,不能直接使用
类相当于建造实体的图纸,不能直接使用,但可以依据它创建不同的对象
1.2对象
对象是由类创造出来的具体存在,是可以直接使用的,由某一个类创造出来的对象就拥有该类的属性和方法
对象就是有图纸建造出来的实体
02、类和对象的关系
- 先有类才有对象,相当于先有图纸再有由图纸建造的实体
- 对象是按照类创建的,类中有的属性和方法在对象中也同样有,不会多也不会少
- 类只有一个,但对象可以有很多个,例如:飞机图纸只有一个但是由图纸创建出来的飞机有很多架(同一类创建的对象在属性上可能会有一点差异,例如有蓝色和白色的飞机)
03、类的设计
在面向对象编程前,需要分析需求,确定程序中需要包括哪些类
在程序开发的过程中,要设计一个类需要满足以下三个要素:
- 类名,需要满足大驼峰命名法(即:每一个单词首字母大写,且不用下划线连接 例如:CapWords)
- 属性,这类事物具有什么样的特征
- 方法,这类事务有什么样的行为
3.1类名的确定
在整个业务流程中提炼名词,这一般就是要创建的类
3.2属性和方法的确定
- 对 对象的特征描述就是对象的属性
- 对象具有的行为,就是对象的方法
三、面向对象基础语法
01、dir函数
在python中可以使用两个方法验证对象
- 在标识符/数据后面输入 . (后再按TAB键),就会提示可以调用的方法
- 使用内置函数dir传入标识符或数据可以查看对象内所有的属性和方法
__方法名__格式的方法是python提供的内置方法/属性,
方法名 | 类型 | 作用 |
__new__ | 方法 | 创建方法时,会被自动调用 |
__init__ | 方法 | 对象被初始化时,会被自动调用 |
__del__ | 方法 | 对象被内存销毁前,会自动调用 |
__str__ | 方法 | 返回对象的描述性息,print函数输出使用 |
02、定义简单的类(只包含方法)
2.1定义只包含方法的类
class 类名:
def 方法1(self,参数1):
pass
def 方法2(self,参数2):
pass
方法的定义格式和之前学习的函数几乎一样,区别在于第一个参数必须是self
2.2 创建对象
当一个类创建完成后,就可以用这个类来创建对象:
对象名 = 类名()
2.3创建一个面向对象的程序
需求:小猫爱吃鱼,小猫要喝水
分析:名词小猫——类
动词吃鱼、喝水——方法
# 创建猫类 class Cat: def eat(self): print("小猫爱吃鱼") def drink(self): print("小猫要喝水") # 创建tom对象 tom = Cat() tom.eat() tom.drink() """输出结果: 小猫爱吃鱼 小猫要喝水"""
在python中创建对象之后,tom变量仍然记录的是对象在内存中的地址,即tom变量引用了新建的猫对象,可以使用print函数输出对象变量,一般会输出对象变量的类和其内存地址(16制)
在python中使用格式化输出%d输出的是10进制数字,%x输出的是16进制的数字
进阶:再创建一个对象,虽然都是Cat类创建的对象,但他们是不同的对象
lazy_cat = Cat() lazy_cat.drink() lazy_cat.eat()
03、方法中的self参数
3.1给上述案例增加属性
给对象增加属性很简单但不推荐使用
只需要在对象名后通过 . 设置一个属性就可以了
tom = Cat() tom.name = "tom" ...... lazy_cat = Cat() lazy_cat.name = "lazycat"
3.2 使用self在方法内部输出每一只猫的名字
注意:由哪一个对象调用方法,方法内的self就是哪一个对象的引用
- 在类封装的内部,self就表示当前调用方法的对象自己
- 调用方法时,不需要传递self参数
- 在方法内部,可以通过self.访问对象的属性
- 也可以通过self.调用其他对象方法
class Cat: def eat(self): print("%s爱吃鱼" % self.name) def drink(self): print("%s要喝水" % self.name)
......
"""输出结果:
tom爱吃鱼
tom要喝水
<__main__.Cat object at 0x0000023BE746B358>
lazy_cat要喝水
lazy_cat爱吃鱼
<__main__.Cat object at 0x0000023BE74ECBE0>"""
在类的外部,通过变量名. 访问对象的属性和方法‘
在类的内部,通过self. 访问对象的属性和方法
04,初始化方法
4.1、在类的外部增加属性的弊端
在类的外部增加属性,在日常的编写中不推荐使用,因为在运行时如果没有找到这个属性,程序会报错
所以应该在类内部封装对象的所有属性
4.2 初始化方法
- 在使用类名创建对象时,会自动执行以下操作
- 为对象在内存中分配空间——创建对象
- 为对象的属性设置初始值——初始化方法(init)
初始化方法__init__,是对象的内置方法,专门用来定义一个类拥有哪些属性的
初始化方法在调用函数时,会被自动调用
class Cat: def __init__(self): print("这是一个初始化方法") tom = Cat() """输出结果: 这是一个初始化方法"""
4.3在初始化方法内部定义属性
在__init__方法内部使用self.属性名= 属性的初始值 就可以定义属性
在定义属性之后,在使用类创建的对象就拥有了该属性
class Cat: def __init__(self): self.name = "tom" def eat(self): print("%s 爱吃鱼" % self.name) tom = Cat() tom.eat() """输出结果: tom 爱吃鱼 """
4.4 初始化的同时设定初始值
类中的属性创立其实和函数的创立是很相似的,所以,也可以给初始化方法加入形参,以接受外部的实参,就可以在创建对象时,设置不同对象的参数
- 把希望设置的属性值,设置成__init__方法的参数
- 在方法内部使用self.属性=形参接受外部传递的参数
在创建对象时,使用类名(属性1,属性2....)调用
class Cat(): def __init__(self,name): self.name = name def eat(self): print("%s 爱吃鱼" % self.name) tom = Cat("tom") tom.eat() lazy_cat = Cat("大懒猫") lazy_cat.eat() """输出结果: tom 爱吃鱼 大懒猫 爱吃鱼 """
05、内置方法和属性
5.1__del__方法
__del__方法是希望对对象被销毁前,再做一些事情的时候,可以使用__del__方法
对于一个对象来说其生命周期从调用类名()开始,到调用__del__方法结束
class Cat(): def __init__(self,name): self.name = name def eat(self): print("%s 爱吃鱼" % self.name) def __del__(self): print("%s离开了" % self.name) tom = Cat("tom") tom.eat() lazy_cat = Cat("大懒猫") lazy_cat.eat() """输出结果: tom 爱吃鱼 大懒猫 爱吃鱼 tom离开了 大懒猫离开了 """
__del__方法会在所有的代码执行完成之后,最后自动调用
5.2 __str__方法
在python中使用print输出对象变量,实际上会输出引用的对象是由哪一个类创建的对象,以及在内存中的地址(十六进制表示),在开发中,希望使用print输出变量时,打印自定义的内容,就可以使用__str__方法
注意:__str__方法必须返回一个字符串
class Cat(): def __init__(self,name): self.name = name def __str__(self): return "我是小猫 %s " % self.name tom = Cat("tom") print(tom) """输出结果:我是小猫tom"""