【Python】面向对象(专版提升2)

面向对象

  • 1. 概述
    • 1.1面向过程
    • 1.2 面向对象
  • 2. 类和对象
    • 2.1 语法
      • 2.1.1 定义类
      • 2.1.2 实例化对象
    • 2.2 实例成员
      • 2.2.1 实例变量
      • 2.2.2 实例方法
      • 2.2.3 跨类调用
  • 3. 三大特征
    • 3.1 封装
      • 3.1.1 数据角度
      • 3.1.2 行为角度
      • 3.1.3 案例:信息管理系统
        • 3.1.3.1 需求
        • 3.1.3.2 分析
        • 3.1.3.3 设计
    • 3.2 继承
      • 3.2.1 继承方法
      • 3.2.2 内置函数
      • 3.2.4 定义
    • 3.3 多态
      • 3.3.1 定义
      • 3.3.2 重写
      • 3.3.3 重写内置函数

1. 概述

1.1面向过程

(1) 定义:分析出解决问题的步骤,然后逐步实现。
在这里插入图片描述(2) 案例:

dict_bjlz = {
"name": "八角笼中", "type": "剧情", "index": 690761
}
dict_fs = {
"name": "封神第一部", "type": "奇幻", "index": 532622
}
print("%s电影类型是%s,指数%s." %
(dict_bjlz["name"],dict_bjlz["type"],dict_bjlz["index"]))
print("%s电影类型是%s,指数%s." %
(dict_fs["name"],dict_fs["type"],dict_fs["index"]))

(3) 优点:简单直观,适合顺序按步骤执行的任务
(4) 缺点:所有字典都要重复定义键,数据与算法分离不易扩展

1.2 面向对象

(1) 定义:可以使用类将变量与函数组合成新的数据类型
(2)案例:

class Movie:def __init__(self, name, type, index):self.name = nameself.type = typeself.index = indexdef display(self):print("%s电影的类型是%s,指数是%s." % (self.name, 		self.type, self.index))bjlz = Movie("八角笼中","剧情",690761)
fs = Movie("封神第一部","奇幻",532622)
bjlz.display()
fs.display()

(3) 优点:将每个字典相同的键统一定义在类中,将数据与对应的操作组合在一起扩展性强
(4) 缺点:学习曲线陡峭

2. 类和对象

2.1 语法

2.1.1 定义类

在这里插入图片描述
(1) 代码

class 类名:"""文档说明"""def __init__(self,参数):self.实例变量 = 参数def 实例方法(self,参数):pass

(2) 说明
– 类名所有单词首字母大写.
– init 也叫构造函数,创建对象时被调用,也可以省略。
– self 变量绑定的是被创建的对象,名称可以随意。

2.1.2 实例化对象

在这里插入图片描述
(1) 代码

对象名 = 类名(数据)

(2) 说明
– 对象名存储的是实例化后的对象地址
– 类名后面的参数按照构造函数的形参传递

2.2 实例成员

2.2.1 实例变量

(1) 语法
a. 定义:对象.变量名
b. 调用:对象.变量名
(2) 说明
a. 首次通过对象赋值为创建,再次赋值为修改.

class Movie:passmovie = Movie()
movie.name = "八角笼中"
movie.name = "封神第一部"

b. 通常在构造函数(_init)中创建

class Movie:def __init__(self, name, type, index):self.name = namemovie = Movie("八角笼中")
print(movie.name)

(3) 每个对象存储一份,通过对象地址访问
(4) 作用:描述某个对象的数据。
(5) dict:对象的属性,用于存储自身实例变量的字典。

2.2.2 实例方法

(1) 定义

def 方法名称(self, 参数):方法体

(2) 调用:

对象.方法名称(参数)
# 不建议通过类名访问实例方法

(3) 说明
– 至少有一个形参,第一个参数绑定调用这个方法的对象,一般命名为self。
– 无论创建多少对象,方法只有一份,并且被所有对象共享。
(4) 作用:表示对象行为。

2.2.3 跨类调用

# 写法1:直接创建对象
# 语义:老张每次创建一辆新车去
class Person:def __init__(self, name=""):self.name = namedef go_to(self,position):print("去",position)car = Car()car.run()class Car:def run(self):print("跑喽~")lz = Person("老张")
lz.go_to("东北")# 写法2:在构造函数中创建对象
# 语义:老张开自己的车去
class Person:def __init__(self, name=""):self.name = nameself.car = Car()def go_to(self,position):print("去",position)self.car.run()class Car:def run(self):print("跑喽~")lz = Person("老张")
lz.go_to("东北")# 方式3:通过参数传递
# 语义:老张用交通工具去
class Person:def __init__(self, name=""):self.name = namedef go_to(self,vehicle,position):print("去",position)vehicle.run()class Car:def run(self):print("跑喽~")lz = Person("老张")
benz = Car()
lz.go_to(benz,"东北")

3. 三大特征

3.1 封装

3.1.1 数据角度

(1) 定义:将一些基本数据类型复合成一个自定义类型。
(2) 优势:
– 将数据与对数据的操作相关联。
– 代码可读性更高(类是对象的模板)。

3.1.2 行为角度

(1) 定义:
向类外提供必要的功能,隐藏实现的细节。
(2) 优势:
简化编程,使用者不必了解具体的实现细节,只需要调用对外提供的功能。
(3) 私有成员:
– 作用:无需向类外提供的成员,可以通过私有化进行屏蔽。
– 做法:命名使用双下划线开头。
– 本质:障眼法,实际也可以访问。
私有成员的名称被修改为:类名_成员名,可以通过__dict__属性查看。
– 演示

class MyClass:def __init__(self, data):self.__data = datadef __func01(self):print("func01执行了")m01 = MyClass(10)
# print(m01.__data) # 无法访问
print(m01._MyClass__data)
print(m01.__dict__) # {'_MyClass__data': 10}
# m01.__func01() # 无法访问
m01._MyClass__func01()

3.1.3 案例:信息管理系统

3.1.3.1 需求

实现对用户信息的增加、删除、修改和查询。

3.1.3.2 分析

界面可能使用控制台,也可能使用Web等等。
(1) 识别对象:界面视图类 逻辑控制类 数据模型类
(2) 分配职责:
– 界面视图类:负责处理界面逻辑,比如显示菜单,获取输入,显示结果等。
– 逻辑控制类:负责存储用户信息,处理业务逻辑。比如添加、删除等
– 数据模型类:定义需要处理的数据类型。比如用户信息。
(3) 建立交互:

界面视图对象 <----> 数据模型对象 <----> 逻辑控制对象

3.1.3.3 设计

(1) 数据模型类:UserModel
– 数据:编号 id,姓名 name,年龄 login_id,密码 pwd
(2) 逻辑控制类:UserController
– 数据:用户列表 list_user
– 行为:添加用户 add_user,删除用户remove_student,修改用户update_student
(3) 界面视图类:UserView
– 数据:逻辑控制对象controller
– 行为:显示菜单__display_menu,选择菜单项__select_menu,入口逻辑main,
输入学生__input_users,输出学生__display_user,删除学生__delete_user,
修改学生信息__modify_user

3.2 继承

3.2.1 继承方法

(1) 语法:

class 父类:def 父类方法(self):方法体class 子类(父类)def 子类方法(self):方法体儿子 = 子类()
儿子.子类方法()
儿子.父类方法()

(2) 说明:
子类直接拥有父类的方法.
(3) 演示:

class Person:def say(self):print("说话")class Teacher(Person):def teach(self):self.say()print("教学")class Student(Person):def study(self):self.say()print("学习")qtx = Teacher()
qtx.say()
qtx.teach()xm = Student()
xm.say()
xm.study()

3.2.2 内置函数

(1) isinstance(对象, 类型)
对象是否为一种类型
(2) type(类型) == 类型
对象的类型是否是一种类型
(3) 演示

# 对象 是一种 类型: isinstance(对象,类型)
# 老师对象 是一种 老师类型
print(isinstance(qtx, Teacher)) # True
# 老师对象 是一种 人类型
print(isinstance(qtx, Person)) # True
# 老师对象 是一种 学生类型
print(isinstance(qtx, Student)) # False
# 人对象 是一种 学生类型
print(isinstance(p, Student)) # False
# 是的关系
# 老师对象的类型 是 老师类型
print(type(qtx) == Teacher) # True
# 老师对象的类型 是 人类型
print(type(qtx) == Person) # False

3.2.3 继承数据
(1) 语法

class 子类(父类):def __init__(self,父类参数,子类参数):super().__init__(参数) # 调用父类构造函数self.实例变量 = 参数

(2) 说明
子类如果没有构造函数,将自动执行父类的,但如果有构造函数将覆盖父类的。此时必须通过super()函数调用父类的构造函数,以确保父类实例变量被正常创建。
(3) 演示

class Person:def __init__(self, name="", age=0):self.name = nameself.age = age# 子类有构造函数,不会使用继承而来的父类构造函数[子覆盖了父方法,好像它不存在]
class Student(Person):# 子类构造函数:父类构造函数参数,子类构造函数参数def __init__(self, name, age, score):# 调用父类构造函数super().__init__(name, age)self.score = scorets = Person("唐僧",22)
print(ts.name)
kw = Student("悟空", 23, 100)
print(wk.name)
print(wk.score)

3.2.4 定义

(1) 概念: 重用现有类的功能,并在此基础上进行扩展。
(2) 说明:子类直接具有父类的成员(共性),还可以扩展新功能。
(3) 相关知识
– 父类(基类、超类)、子类(派生类)。
– 父类相对于子类更抽象,范围更宽泛;子类相对于父类更具体,范围更狭小。
– 单继承:父类只有一个(例如 Java,C#)。
– 多继承:父类有多个(例如C++,Python)。
– Object类:任何类都直接或间接继承自 object 类。

3.3 多态

3.3.1 定义

(1) 字面意思:对于一种行为有不同表现形态。
(2) 概念:对于父类的一个方法,在不同的子类上有不同体现。
(3) 说明:编码时调用父类方法,运行时传递子类对象执行子类方法。

3.3.2 重写

(1) 定义:在子类定义与父类相同的方法。
(2) 作用:改变父类行为,体现子类个性。

3.3.3 重写内置函数

(1) 定义:Python中,以双下划线开头、双下划线结尾的是系统定义的成员。我们可以在自定义类中进
行重写,从而改变其行为。
(2) str 函数:将对象转换为字符串(对人友好的)
– 演示

class Movie:
def __init__(self, name, type, index):
self.name = name
self.type = type
self.index = index
def __str__(self):
print("%s电影的类型是%s,指数是%s." % (self.name, self.type, self.index))
bjlz = Movie("八角笼中","剧情",690761)
fs = Movie("封神第一部","奇幻",532622)
print(bjlz)
print(fs)

(3) 算数运算符
在这里插入图片描述

(4) 复合运算符重载
在这里插入图片描述

(5) 比较运算重载
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/812858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器 安装1Panel服务器运维管理面板

服务器 安装1Panel服务器运维管理面板 SSH链接服务器安装1Panel 出现此提示时输入目标路径&#xff0c;须以“/”开头&#xff0c;默认&#xff1a;/opt&#xff0c;本例&#xff1a;/www。 出现此提示时输入目标端口&#xff0c;须未被使用的端口&#xff0c;默认&#xff1…

【MYSQL管理工具】数据库备份和恢复

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1.MYSQL管理 1.1 系统数据库 1.2 常用工具 1.2.1 mysql 1.2.2 mysqladmin 1.2.3 mysqlbinlog 1.2.4 mysqlshow 1.2.5 mysqldump 1.2.6 mysqlimport/sour…

本地web项目启起来后,无法在浏览器(chrome)看到源码,从而无法打断点;Framework Ignore list

问题描述 本地web项目启起来后&#xff0c;无法在浏览器(chrome)看到源码&#xff0c;从而无法打断点 其他浏览器没看&#xff0c;开发环境一致专注于chrome&#xff08;其余浏览器有测试同事提缺陷了&#xff0c;才会去看&#xff09;&#xff0c;其余浏览器有没有这个问题&…

Docker 镜像推送到docker hub

查看容器 #sudo docker ps -a commit容器为镜像 $ sudo docker commit d7b5e8d56a75 ubuntu_pytorch39_v4 #sha256: ********** 查看镜像信息 $ sudo docker images 登录 docker hub $ sudo docker login --username用户名 registry.cn-beijing.aliyuncs.com #密码 为…

AIGC的崛起:定义未来内容创作的新纪元

&#x1f31f;文章目录 &#x1f31f;AIGC简介&#x1f31f; AIGC的相关技术与特点&#x1f31f;AIGC有哪些应用场景&#xff1f;&#x1f31f;AIGC对其他行业影响&#x1f31f;面临的挑战与问题&#x1f31f;AIGC未来发展 &#x1f31f;AIGC十大热门网站推荐&#xff1a; 文心…

吴恩达机器学习-实践实验室:协同过滤推荐系统(Collaborative Filtering Recommender Systems)

在本练习中&#xff0c;您将实现协作过滤&#xff0c;以构建电影推荐系统。 文章目录 1-概念2-推荐系统3-电影评分数据集4-协作过滤学习算法4.1协同过滤成本函数 5-学习电影推荐6-建议7-祝贺 软件包 我们将使用现在熟悉的NumPy和Tensorflow软件包。 import numpy as np import…

调用nltk分词库时出现nltk_data Error loading averaged_perceptron_tagger问题的解决办法

问题描述&#xff1a;运行时出现[nltk_data] Error loading averaged_perceptron_tagger&#xff0c;Name or service not known问题&#xff0c;详见下图。 由于这个问题最近总是困扰开发和调试工作&#xff0c;因此将彻底的解决办法记录如下&#xff0c;如下设置好就不需要漫…

【数据结构】07查找

查找 1. 基本概念2. 顺序表查找2.1 顺序查找2.2 顺序查找优化-哨兵 3. 有序表查找3.1 折半查找&#xff08;二分查找&#xff09; 4. 分块查找&#xff08;索引顺序查找&#xff09;5. Hash表&#xff08;散列表&#xff09;5.1 散列函数的设计5.2 代码实现5.2.1 初始化Hash表5…

装修后快速入住指南,除甲醛的10个小妙招。福州中宅装饰,福州装修

装修后除甲醛的方法有很多种&#xff0c;以下是一些常见的方法&#xff1a; 1. 通风 通风是最基本的除甲醛方法之一&#xff0c;打开窗户让空气流通&#xff0c;可以将室内的甲醛排出。可以在早晨和晚上空气质量较好的时候进行通风。 2. 植物吸收 一些植物如吊兰、常春藤、虎…

李廉洋;4.13黄金,原油最新资讯,下周一盘走势分析及策略。

美国杜克大学大宗商品研究教授Harvey表示&#xff0c;目前除了避险情绪外&#xff0c;“上涨惯性”也是促使黄金“疯涨”的原因。他表示&#xff1a;“目前不断涌入黄金市场的资金实际上在增加风险敞口&#xff0c;除了散户&#xff0c;对冲基金和其他机构投资者也加入了黄金热…

vue 百度地图 使用 vue-baidu-map 进行当前位置定位和范围展示

vue 百度地图 使用 vue-baidu-map 进行当前位置定位和范围展示&#xff08;考勤打卡&#xff09; 一、创建百度地图账号&#xff0c;获取秘钥二、 引入插件1、安装vue-baidu-map2、在main.js中引入 三、 简单使用 最近写项目的时候&#xff0c;做到了考勤打卡的模块内容&#x…

pbootcms百度推广链接打不开显示404错误页面

PbootCMS官方在2023年4月21日的版本更新中&#xff08;对应V3.2.5版本&#xff09;&#xff0c;对URL参数添加了如下判断 if(stripos(URL,?) ! false && stripos(URL,/?tag) false && stripos(URL,/?page) false && stripos(URL,/?ext_) false…

记一次http访问超时服务器端调试

问题&#xff1a;http访问服务器时没有返回&#xff0c;没有超时&#xff0c;一直在阻塞 处理过程&#xff1a;telnet端口能连上&#xff0c;服务端程序也不存在处理时间过长的情况。 说明tcp连接没问题。推测是客户端连接后再发起请求&#xff0c;服务端阻塞了。因为很多客户…

PrimeKG:为精准医学分析设计的多模态知识图谱

PrimeKG&#xff1a;为精准医学分析设计的多模态知识图谱 PrimeKG简介数据资源和覆盖范围构建方法和技术细节PrimeKG多模态知识图谱的概览构建PrimeKG的过程PrimeKG 数据 多模态特性和临床应用PrimeKG 设计逻辑 论文&#xff1a;https://www.nature.com/articles/s41597-023-01…

最齐全,最简单的免费SSL证书获取方法——实现HTTPS访问

一&#xff1a;阿里云 优势&#xff1a;大平台&#xff0c;在站长中知名度最高&#xff0c;提供20张免费单域名SSL证书 缺点&#xff1a;数量有限&#xff0c;并且只有单域名证书&#xff0c;通配符以及多域名没有免费版本。并且提供的单域名证书只有三个月的期限。 二&#…

GPDB技术内幕 - SEMI JOIN浅析

GPDB技术内幕 - SEMI JOIN浅析 SEMI JOIN顾名思义&#xff0c;半连接&#xff0c;相对于join字段来说&#xff0c;针对外表的一行记录&#xff0c;内表只要有一条满足&#xff0c;就输出外表记录。注意&#xff0c;这里是仅输出外表记录。GPDB中有几种实现方式&#xff0c;本文…

编译 c++ 编译的艮,一个编译回合下来 的需要换电脑!

研究这些ui 组件。 这的单独给他准备一台电脑了。 不是cmake 版本对不对。就是qt 版本不对。或者vs 版本太低。 sdk 没有包&#xff0c;编译包&#xff0c;需要组件&#xff0c;组件需要 qt5.5 但是 安装6.5.3 一个回和下来&#xff0c; 电脑坏了。随后旧项目 不能编译了&…

实战要求下,如何做好资产安全信息管理

文章目录 一、资产安全信息管理的重要性二、资产安全信息管理的痛点三、如何做好资产安全信息管理1、提升资产安全信息自动化、集约化管理能力&#xff0c;做到资产全过程管理2、做好资产的安全风险识别3、做好互联网暴露面的测绘与管空4、做好资产安全信息的动态稽核管理 “摸…

代码随想录day39 | 动态规划P2 | ● 62 ● 63

62.不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…

el-date-picker禁用指定范围的日期

elementUI中el-date-picker禁用指定日期之前或之后的日期 通过配置picker-options配置指定禁用日期&#xff08;pickerOptions写到data里面&#xff09; <el-date-pickerv-model"date"type"date"size"small"value-format"yyyy-MM-dd&qu…