创作不易,各位看官,点个赞收藏、关注必回关、QAQ、您的点赞是我更新的最大动力!
(一)什么是面向对象
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)的主要思想是 把构成问题的各个事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了 描叙一个事物在整个解决问题的步骤中的行为 |
(二)面向过程和面向对象
面向过程和面向对象都是软件开发行业中的编程思想,在软件开发历程中都扮演了非常 重要的角色,面向过程编程思想最直观的实现方式就是函数式编程,面向对象的最直观的实 现方式是类和对象 |
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使 用的时候一个一个依次调用就可以解决问题。面向对象是把构成问题的事物分解成各个对象, 通过对象的行为之间的互相关联解决问题,同时抽取的对象本身都是独立的,可以扩展出更 多的实现。面向过程和面向对象最直观的理解如下图所示: |
面向对象和面向过程不同的是,将构成问题的各个事物抽象出来作为单独的对象,此时 每个对象的行为就不再局限于解决固定问题的某个步骤了,而是可以让对象的行为适用于任 何一个可以起到作用的地方,这样做的结果就是软件的功能得到了非常好的扩展 |
返回文章目录
(一)术语解释
1、对象(object)
生活中有一句话,万物皆对象,对象就是生活中客观存在的实际物体,也被称为实体,实体
对象,实例,实例对象。
2、类(class)
类其实就是类型的简称,描述的是不同的数据类型,生活中还是那句话:万物皆对象,各种
事物分门别类,描述生活中的不同类型的事物,就是类
3、属性(Attribute)
生活中的实体物体,都是包含自己的特征的,如人包含姓名、性别、年龄、肤色特征(名词),
电脑包含颜色、尺寸、CPU、内存特征,课程包含名称,时长,周期特征。
属性就是对象的特征(名词)。
4、方法(Method)
生活中的实体物体,都是包含具体的行为的,如人包含吃饭睡觉打豆豆…行为,电脑包含开 机、关机、播放、游戏、办公行为,课程包含信息传播行为。
方法就是对象的行为(动词)。
5、其它(other)
面向对象中还会涉及到封装、继承、多态、数据绑定、消息通信等等,具体的概念和应 用都会在后续的章节中进行详细解读
(二)类型声明
类和对象是计算机编程语言中的用于描述事物的载体。它们的关系是,对象是类的实例, 类是对象的模板。如下图所示:
(三)类型声明
类型声明是面向对象程序设计开发的第一个环节,本节内容通过基本语法、命名规范先 了解类型的基本建模方式,再分析在项目案例中怎么分析和构建符合需求的类型
1、基本语法
Python 编程语言的语法提供了 class 关键字,用于类型的声明,基本语法如下:
2、声明规范
Python 编程语言相比较其他编程语言,为了简化编码制定了更加严格的语法规则,并 且在软件开发过程中通过开发规范进行约束
① 类型名称:标识符(字母、数字、下划线组成,数字不能开头)
帕斯卡命名法(大驼峰命名法):一个或者多个单词组成,每个单词首字母大写
② 属性特征:就是一个变量,必须和 self 一起使用;
遵循变量的命名规则[见名知意、下划线命名法]
③ 方法行为:就是一个函数,遵循函数的命名规则[见名知意、下划线命名法]
帕斯卡命名法,某些资料中也称为大驼峰命名法,是由一个或者多个单词组成,每个大 单词的首字母大写,如:UserInformation、Consumer,Goods 等等 |
驼峰命名法,某些资料中也称为小驼峰命名法,是由一个或者多个单词组成,第一个单 词全部小写,后面每个大单词的首字母大写,如:userGender、userType 等等 |
方法,本质上就是在类型中声明的函数(类型赋予了方法更多的功能),所以方法名称的 命名规范和函数的命名规范一致,做到见名知意,优先推荐下划线命名法,或者使用驼峰命 名法 |
类型在标准开发规范的约束下,要求在类型声明内部第一行必须包含文档注释,描述类 型的作用,在类型内部先声明属性,再声明方法,不同的方法之间分隔一个空行 |
下面的代码中,声明了一个普通的用户类型,类型包含账号、密码、昵称属性,包含保 存、删除的方法 |
class User:
"""用户类型"""
def __init__(self,username,password,nickname):
"""记录用户属性"""
print("开始执行对象初始化")
self.username = username
self.password = password
self.nickname = nickname
def save(self):
"""保存方法"""
pass
def delete(self):
"""删除方法"""
print("执行删除操作")
(四)面向对象设计开发
面向对象程序设计开发,是一种成熟的程序设计开发方式,有固定的开发步骤,通常包 含如下四个环节:
面向对象分析(OOA:Object-Oriented Analysis) | 从用户需求出发,分析项目中需要解决的问题,抽象项目中的功能和互相依赖 的关系,确定功能开发过程中的限制条件 |
面向对象设计(OOD:Object-Oriented Design) | 根据分析得到的具体的问题,抽取参与解决问题的对象 |
面向对象编程(OOP:Object-Oriented Programming) | |
编程对象测试(OOT:Object-Oriented Testing) |
软件从开发到交付的完整示意流程,如下图所示:
1、项目分析
以个人博客项目为例进行面向对象的分析及开发,个人博客是以信息共享和社交 为目的经典软件产品,首先针对个人博客的功能进行分解,如图所示:
项目中需要的功能,就是我们需要解决的问题,根据面向对象的设计原则,简要分析实 现上述功能需要参与的对象,如图所示:
2、声明类型
根据项目分析,我们需要创建项目中需要的类型,首先创建项目并构建项目结构,项目 名称为:blog,项目中定义类型的模块为:model.py,初始项目结构如下图所示:
返回文章目录
(一)基本语法
实例属性,是类型中用于描述每个对象具体数据的,在类型声明过程中,将实例属性声 明在__init__()方法中,通过接受传递的参数数据进行数据初始化,基本语法如下:
class User:
"""用户类型"""
def __init__(self,username,password,nickname):
"""记录用户属性"""
print("开始执行对象初始化")
self.username = username
self.password = password
self.nickname = nickname
实例方法,是类型中描述每个对象的行为操作的,通过函数语法进行体现,将对象的行 为函数声明在类型的内部,称为类型的实例方法,基本语法如下:
class User:
"""用户类型"""
def __init__(self,username,password,nickname):
"""记录用户属性"""
print("开始执行对象初始化")
self.username = username
self.password = password
self.nickname = nickname
def save(self):
"""保存方法"""
pass
def delete(self):
"""删除方法"""
print("执行删除操作")
(二)self关键字
类型中的方法,第一个参数都是 self,self 关键字用于描述当前对象自身,类似生活中” 我”这个名词一样,通过 self 可以在实例方法中获取到当前对象自身的所有实例属性和实例 方法
self 关键字主要用于描述当前对象,声明在方法的第一个位置参数上,是一个变量,所以可 以修改成任意单词来表示,但是约定俗称使用 self 这个单词 |
(三)实例操作
个人博客项目中,我们已经根据功能涉及的对象抽取了作者类型和文章类型,根据我们 在项目中的操作方式,就可以为所有的作者声明他们共有的属性和方法了,文章亦如此
根据分析得到的结果,按照类型声明的语法,完善作者类型的实例属性和实例方法,操 作代码如下:
(一)创建对象语法
通过声明的类型,可以创建该类型对应的具体对象,基本语法如下:
创建对象时就可以将数据通过参数传递给__init__()方法完成属性的初始化,并 将创建好的对象的地址存储在 user 变量中,通过 user 变量可以找到或者引用到创建的对象, 所以称 user 变量为对象的引用变量
(二)对象属性和方法
创建对象是为了使用对象的属性和方法,在语法中可以通过对象的引用变量来获取对象 并操作对象的属性和方法
1、对象的实例属性
2、对象的实例方法
(三)、对象的创建过程
程序都是运行在计算机内存中的,对象的创建也是在程序申请的内存空间中完成的,在 对象构建过程中,主要经历了申请空间、创建对象、属性初始化的过程
运行程序,就可以看到在创建对象时,解释器自动调用了__new__(cls)创建对象,调用 init(self)初始化数据的过程
通过代码进行演示,可以看到解释器构建对象的过程:
# - 申请空间-->创建对象-->属性初始化
#
# - 类名(),准备创建对象,申请内存空间-->调用`__new__`()方法,创建对象-->
# 调用`__init__`()方法,对象初始化-->将创建好的对象赋值给"="左边的变量
class User:
"""用户类型"""
def __init__(self,username):
"""记录用户属性"""
print("对象初始化操作")
self.username = username
def __new__(cls, *args, **kwargs):
"""创建对象"""
print("开始创建对象")
return object.__new__(cls)
user = User("稳稳")
返回文章目录
(一)对象的打印
通过对象的创建过程了解到,对象一旦创建完成,是将对象在内存中的地址临时存储在 引用变量中的,这样通过引用变量才能访问到对象,所以在程序中直接打印可以找到对象的 引用变量时,就会得到引用变量中存储的内存地址数据
class User:
"""用户类型"""
def __init__(self,username,password,nickname):
"""记录用户属性"""
self.username = username
self.password = password
self.nickname = nickname
def save(self):
"""保存方法"""
pass
def delete(self):
"""删除方法"""
print("执行删除操作")
# 创建user对象,会自动执行__init__()方法
user = User("稳稳","123","C9")
print(user)
print(id(user))
(二)str()和repr()
项目中直接访问对象,就会获取到对象的内存地址,对于项目的开发人员来说,更多的 时候关注的是对象本身的数据,打印对象直接获取对象内部关键数据是一种非常直观并且非
1、str()
#可以通过 对象名.属性名 查看属性值,但是当属性比较多时,查看属性就不太方便
#打印对象时,会自动调用__str__()方法
class User:
"""用户类型"""
def __init__(self,username,password,nickname):
"""记录用户属性"""
self.username = username
self.password = password
self.nickname = nickname
def __str__(self):
print("--str--")
# return "123"
return f"{self.username} {self.password} {self.nickname}"
user = User("稳稳","123","C9")
#打印对象会自动执行__str__()方法
print(user)
print([user])
class User:
"""用户类型"""
def __init__(self,username,password,nickname):
"""记录用户属性"""
self.username = username
self.password = password
self.nickname = nickname
# def __str__(self):
# print("--str--")
# return f"{self.username} {self.password} {self.nickname}"
def __repr__(self):
print("--repr--")
return f"{self.username} {self.password} {self.nickname}"
user = User("稳稳","123","C9")
#打印对象会自动执行__str__()方法,如果没有此方法,会寻找__repr__()方法
print(user)
print([user])
class Student:
"""学生类"""
def __init__(self,name,age):
"""初始化属性"""
self.name = name #stu1.name="稳稳"
self.age = age
def __str__(self):
"""自我介绍的方法"""
return (f"我叫{self.name},今年{self.age}岁,请多多关照!")
stu1 = Student("稳稳",20)
print(stu1)
返回文章目录
1、老张开车去东北[函数式]
# 老张开车去东北
#
# ```
# 需求:发动车辆,输入姓名,车型,到达的目的地(面向过程)
# 定义车辆发动函数,驾驶函数,到达目的地函数
# ```
import time
def start():
"""驾驶员"""
name = input("请输入姓名:")
print("用户:",name)
#调用车辆驾驶函数
driver(name)
def driver(name):
"""驾驶"""
car = input("请输入车的型号")
print(f"{name}驾驶{car},准备出发。。。")
area = input("请输入要到达的目的地")
#调用到达目的地函数
run(area)
def run(area):
"""车行驶到达目的地"""
for i in range(10):
time.sleep(0.5)
print("->",end='')
print("经过跋山涉水,到达目的地",area)
# start()
2、老张开车去东北[面向对象]
# 面向对象开车
# 老张开车去东北
# """
# 人类
# 属性:姓名,年龄,性别
# 方法:开车 (传递一个车对象,直接调用车行驶的方法,不需要关系车是如何行驶的)
# 车类
# 属性:品牌,颜色
# 方法:行驶
# 地点类
# 属性:省市县
# """
class Person:
"""人的类型"""
def __init__(self,name,age,gender):
"""属性初始化方法"""
self.name = name
self.age = age
self.gender = gender
def driver(self,car):
"""开车,人的行为"""
print(f"{self.name}准备出发")
#调用车对行驶的方法
car.run("东北")
class Car:
def __init__(self,brand,color):
"""属性初始化方法"""
self.brand = brand
self.color = color
def run(self,area):
print(f"{self.color}的{self.brand}发动了,准备去{area}")
# #创建出所有参数问题的对象
per1 = Person("老张",50,"男")
qirui = Car("瑞虎5x","灰色")
per1.driver(qirui)
#
# aodi = Car("奥迪A6","白色")
# per2 = Person("老王",45,"男")
# per2.driver(aodi)
3、文章发表
#发表文章练习
"""
文章有标题,作者,内容,可以保存,数据保存在类属性中
数据类型:可以保存数据
文章类型:
属性:标题,作者,内容
方法:保存
"""
class Database:
"""数据类型"""
#保存文章的类属性
article_dict = {}
class Article:
def __init__(self,title,author,content):
"""实例属性初始化"""
self.title = title
self.author = author
self.content = content
def save(self):
"""保存文章数据"""
#字典根据键保存值的方法 self是当前文章对象
Database.article_dict[self.title] = self
#发表文章
title = input("请输入文章标题:")
author = input("请输入文章作者:")
content = input("请输入文章内容:")
#创建文章对象
article = Article(title,author,content)
#保存文章
article.save()
#查看文章数据
for title,article in Database.article_dict.items():
print(f"标题:{title}\n文章内容:{article.content}")
返回文章目录