【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 = name
		self.type = type
		self.index = index
	def 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:
	pass

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

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

class Movie:
	def __init__(self, name, type, index):
		self.name = name

movie = 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 = name
	def 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 = name
		self.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 = name
	def 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 = data
	
	def __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 = name
		self.age = age
		
# 子类有构造函数,不会使用继承而来的父类构造函数[子覆盖了父方法,好像它不存在]
class Student(Person):
	# 子类构造函数:父类构造函数参数,子类构造函数参数
	def __init__(self, name, age, score):
		# 调用父类构造函数
		super().__init__(name, age)
		self.score = score

ts = 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) 比较运算重载
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

照片分辨率怎么调?一键修改图片dpi

当我们需要通过电子邮件、社交媒体、即时消息或在线存储服务共享图片时&#xff0c;较高分辨率的图片文件可能会占用更多的存储空间和传输时间。通过修改图片分辨率&#xff0c;您可以减小文件大小&#xff0c;提高传输速度&#xff0c;并确保照片在网络共享和传输过程中的顺利…

gpu服务器与cpu服务器的区别在哪?

GPU服务器与CPU服务器的区别主要体现在处理能力、应用场景、能源消耗和成本等方面。 处理能力&#xff1a;CPU&#xff08;中央处理器&#xff09;是计算机的“大脑”&#xff0c;负责执行指令和处理数据&#xff0c;它的设计注重于逻辑运算和串行处理能力。而GPU&#xff08;…

隐私计算实训营第九讲-隐语多方安全计算在安全核对的行业实践

隐私计算实训营第九讲-隐语多方安全计算在安全核对的行业实践 文章目录 隐私计算实训营第九讲-隐语多方安全计算在安全核对的行业实践1.业务背景&#xff1a;安全核对产生的土壤1.1相关政策出台1.2 数据差异的来源 2.产品方案&#xff1a;从试点到规模化的路3.技术共建&#xf…

c++ 指针总结

概述 内存地址 在计算机内存中&#xff0c;每个存储单元都有一个唯一的地址(内存编号)。通俗理解&#xff0c;内存就是房间&#xff0c;地址就是门牌号 指针和指针变量 指针&#xff08;Pointer&#xff09;是一种特殊的变量类型&#xff0c;它用于存储内存地址。指针的实质…

Java springmvc 参数名用is开头导致为null

因为最近在整理一些源码和编写规范&#xff0c;这里写一下只是记录几年前自己遇到的问题&#xff0c;好久都忘了&#xff0c;还是写下来比较好。 问题记录&#xff1a;由于变量使用了boolean&#xff0c;并且变量名是is开头的&#xff0c;由于java机制boolean默认是false&#…

阿里云大学生免费服务器申请流程,2024年最新

阿里云学生服务器免费申请&#xff0c;之前是云翼计划学生服务器9元/月&#xff0c;现在是高校计划&#xff0c;学生服务器可以免费申请&#xff0c;先完成学生认证即可免费领取一台云服务器ECS&#xff0c;配置为2核2G、1M带宽、40G系统盘&#xff0c;在云服务器ECS实例过期之…

python入门(一)配置环境和选择IDE

Python&#xff0c;作为一种简洁易懂的编程语言&#xff0c;近年来在全球范围内受到了广泛的关注和追捧。它不仅语法简单明了&#xff0c;易于上手&#xff0c;而且拥有强大的第三方库和广泛的应用领域。从数据分析、机器学习到Web开发&#xff0c;Python都能发挥出色的性能&am…

算法题 - 双指针

目录 125. 验证回文串392. 判断子序列167. 两数之和 Ⅱ - 输入有序数组11. 盛最多的水15. 三数之和 125. 验证回文串 LeetCode_link 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 …

面相对象设计

设计原则 创建性模式 结构性模式 行为模式

C++11 设计模式3. 工厂方法模式

简单工厂模式的遗留问题 //从上面的代码可以看到&#xff0c;简单工厂模式确实实现了new 出来具体对象&#xff0c; 和 业务逻辑的分离&#xff0c; //但是不符合 "开闭原则" //"开闭原则"说的是代码扩展性问题——对扩展开放&#xff0c;对修改关…

算法设计与分析实验报告c++实现(TSP问题、哈夫曼编码问题、顾客安排问题、最小生成树问题、图着色问题)

一、实验目的 1&#xff0e;加深学生对贪心算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 用贪心算…

C# 两种方法截取活动窗口屏幕,实现窗体截图

方法1&#xff0c;截屏内容仅包括活动窗口界面&#xff0c;而方法2是从屏幕范围取图&#xff0c;截屏内容会包括屏幕上所有内容。例如有一些程序在桌面顶层显示半透明的悬浮窗&#xff0c;用方法2截屏就会包括这些内容&#xff0c;并不是单纯的活动窗口内容。 方法1&#xff0c…

开源代码分享(19)-配电网孤岛优化划分方法

参考文献&#xff1a; DING Tao, LIN Yanling, LI Gengfeng, et al. A new model for resilient distribution systems by microgrids formation[J]. IEEE Transactions on Power Systems, 2017, 32(5): 4145-4147. 1.基本原理 通过分布式电源&#xff08;DGs&#xff09;形…

蓝桥杯 前一晚总结 模板 新手版

《准备实足&#xff0c;冲冲冲 省一》https://www.yuque.com/lenyan-svokd/hi7hp2/hfka297matrtsxy2?singleDoc# 《准备实足&#xff0c;冲冲冲 省一》 #include<bits/stdc.h> // 包含标准库头文件using namespace std; using ll long long; // 定义 long long 数据类…

218基于matlab的有限差分法求解泊松方程

基于matlab的有限差分法求解泊松方程&#xff0c;采用SOR超松弛迭代法。模型采用方形区域&#xff0c;划分网格数为100*100&#xff0c;网格数可以很方便的更改。程序已调通&#xff0c;可直接运行。 218有限差分法 泊松方程 SOR超松弛迭代法 - 小红书 (xiaohongshu.com)

基于React封装Handsontable并兼容antd

背景 其实Handsontable官方也提供了React的版本&#xff0c;但是官方的版本再编辑和渲染的时候并不能够很好的嵌入第三方的组件库。这就导致了&#xff0c;使用了Handsontable就没有办和普通的react项目一样轻松引用其他第三方组件。因此对其react的版本进行了二次的封装&#…

定制个性化的 openEuler 系统镜像:打造独特的安装体验

前言 标准的操作系统镜像可能无法完全满足特定用户群体或特定应用场景的需求。通过定制化&#xff0c;可以根据具体需求预装特定软件、配置特定网络设置&#xff0c;甚至设置特定的用户权限&#xff0c;以确保系统能够满足用户的需求。定制化系统镜像可以优化安装流程&#xf…

PandasAI的应用与实战解析(二):PandasAI使用流程与功能介绍

文章目录 1.使用PandasAI进行开发的流程2.配置文件解析3.支持的数据库类型4.支持的LLMs5.其他 PandasAI这个工具最突出的优点就是通过结合了Pandas和生成式LLMs&#xff0c;极大地为开发人员降低了工作量。 传统的开发调用流程&#xff08;数据分析相关&#xff09;&#xff1a…

(UDP)其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

“System.Net.Sockets.SocketException”类型的异常在 mscorlib.dll 中发生&#xff0c;但未在用户代码中进行处理其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。这个异常表示端口已经被占用了&#xff0c;需要释放端口或者使用其他端口来建立连接。您可以…

CLion 2024:为Mac与Win打造的卓越跨平台集成开发环境

CLion 2024作为一款跨平台IDE&#xff0c;CLion 2024不仅完美支持Mac和Windows两大操作系统&#xff0c;更在细节之处展现了其出色的跨平台兼容性。无论你是在Mac的优雅界面下工作&#xff0c;还是在Windows的实用环境中编程&#xff0c;CLion 2024都能为你提供一致且流畅的开发…