前言
最近在复习以前学习过的知识,所以更新慢了一点
面向对象
01.面向对象基本概念
·之前学习的编程方式 就是 面向过程的
·面对过程 和面对对象 是两种不同的 编程方式
1.1 过程和函数
·过程 是早期的编程概念
·过程 类似于函数,只能执行,但是没有返回值
·函数 不仅能执行,还能返回结果
1.2 面对过程 和 面对对象 基本概念
1. 面对过程
·把完成某一个需求的 所有步骤 从头到尾 逐步实现
·根据开发需求,将某些 功能独立的 代码 封装 成一个又一个函数
·最后完成的代码,就是顺序的调用不同的函数
特点:
注重步骤于过程,不注重职责分工
如果需求复杂,代码会变得更复杂
开发复杂项目,没有固定的套路,开发难度大
2. 面向对象——谁来做
相比较函数,面向对象 是更大 的封装,根据 职责 在一个对象中 封装多个方法
·在完成某一个需求前,首先确定职责——要做的事情(方法)
·根据职责确定不同的对象,在对象内部封装不同的方法(多个)
·最后完成的代码,就是顺序的让不同的对象,调用不同的方法
特点:
注重对象的职责,不同的对象承担不同的职责
更加适合应对复杂的需求变化,是专门应对复杂项目开发,提供固定套路
需要在面对过程基础上,在学习一些面向对象的语法
面向对象两个核心概念:类和对象
- 1类
·类是对一群具有相同特征 或者 行为 的失误的一个统称,是抽象的,不能直接使用
特征 被称为 属性
行为 被称为 方法
(例如:类 就相当于制造飞机的图纸,是一个模板,是负责创建对象的)
- 2对象
·对象是由类创建出来的一个具体存在,可以直接使用
·由哪一个类创建出来的对象,就是拥有在哪一个类中的定义的:属性和方法
(例:对象 就相当于用图纸 制造 的飞机)
在程序中,应该先有类,再有对象
2. 类和对象的关系
·类是模板,对象 是根据类 这个模板创建出来的,应该先有类,再有对象
·类只有一个,而 对象 可以有很多个(不同的对象之间,属性 可能各不相同)
·类 中定义了什么 属性方法,对象 中就有什么属性和方法,不可能多,也不可能少
3. 类的设计
在使用面向对象开发前,应该首相分析需求,确定一下,程序中需要包含哪些类
在程序开发中,需要设计一个类,通常需要满足以下三个要素:
- 类名 这类事物的名字,满足大驼峰命名法
- 属性 这类事物具有什么样的特征
- 方法 这类事物具有什么样的行为
3.1类名的确定
名词提炼法 分析整个业务流程,出现的名词,通常就是找到的类
3.2属性和方法的确定
·对 对象的特征描述,通常可以定义成 属性
·对象具有的行为(动词),通常可以定义成 方法
面向对象的基础语法
01 定义一个简单的类(只包含方法)
面向对象 是更大的封装,在一个类中 封装对个方法,这样 通过这个类创建出来的对象,就可以直接调用这些方法
-
- 定义只包含方法的类
- 创建对象
下面是练习:
需求
小猫爱吃鱼,小猫要喝水
分析:
定义一个猫类 cat
定义两个方法 eat 和 drink
按照需求,暂时不需要定义属性:
代码:
class Cat:
def eat(self):
print("小猫爱吃鱼")
def drink(self):
print("小猫要喝水")
# 创建毛对象
tom = Cat()
tom.eat()
tom.drink()
输出结果:
下面是创建多个对象的练习:
输出结果:
- 3案例改造——给对象增加属性
·在Python中,要给对象设置属性,非常的容易,但是不推荐使用(因为对象属性的封装应该在类的内部)
·只需要在 类的外部代码中 直接通过 . 设置一个属性即可
(注:这种方法虽然简单,但是不推荐使用)
利用self 在类封装的方法中输出对象属性:
代码:
class Cat:
def eat(self):
# 哪一个对象调用的方法,self就是哪一个对象的引用
print("%s 爱吃鱼" % self.name)
def drink(self):
print("%s 要喝水" % self.name)
# 创建毛对象
tom = Cat()
# 可以使用 .属性名,利用赋值语句就行
tom.name = "Tom"
tom.eat()
tom.drink()
# 再创建一个对象
lazy_cat = Cat()
lazy_cat.name = "懒猫"
lazy_cat.eat()
lazy_cat.drink()
输出结果:
- 4 初始化方法
之前的代码存在的问题——在类的外部给对象增加属性
(注:在日常开发中,不推荐在 类的外部 给对象增加属性,如果在程序运行时,没有找到属性,程序会报错。对象包含的属性,应该封装在类的内部)
下面是报错的演示:
初始化方法就是 __init__ 方法,是对象的内置方法(__init__方法是专门来定义一个类 具有那些属性的方法)
代码:
class Cat:
def __init__(self):
print("这是一个初始化方法")
self.name = "Tom"
tom = Cat()
print(tom.name)
输出结果:
初始化方法的改造:利用参数设置初始值
代码:
class Cat:
def __init__(self,new_name):
print("这是一个初始化方法")
# self.属性名 = 属性的初始值
self.name = new_name
def eat(self):
print("%s 爱吃鱼" % self.name)
tom = Cat("汤姆")
tom.eat()
print(tom.name)
lazy_cat = Cat("懒猫")
lazy_cat.eat()
输出结果:
- 5 内置方法和属性
①__del__ 方法 :对象被从内存中销毁前,会被自动调用
②__str__ 方法 :返回对象的描述信息,print 函数输出使用
__del__方法使用:
代码:
class Cat:
def __init__(self, new_name):
self.name = new_name
print("%s 来了" % self.name)
def __del__(self):
print("%s 走了" % self.name)
# tom是一个全局变量
tom = Cat("Tom")
print(tom.name)
print("_" * 50)
输出结果:
注:del是自动调用的。Tom走了 是出现在下划线下面,证明是在系统最后一次运行,在进行销毁的
__str__ 方法使用:
在使用 str 方法,必须返回一个字符串
代码:
class Cat:
def __init__(self, new_name):
self.name = new_name
print("%s 来了" % self.name)
def __del__(self):
print("%s 走了" % self.name)
def __str__(self):
# 必须返回一个字符串,要返回就可以使用return
return "我是一只猫"
# tom是一个全局变量
tom = Cat("Tom")
print(tom)
输出结果:
(注:del 方法依然是在 str 方法后面输出的).
总结
面向对象,是在做开发时,最常用的方法。在开发比较复杂的代码时,比面向过程(函数)更加的实用,所以是非常重要的知识点