Python-面向对象

面向对象

  • 1.初识对象
    • 1.1理解使用对象完成数据组织的思路
  • 2.成员方法
    • 2.1类的定义和使用语法
    • 2.2成员方法的使用
  • 3.类和对象
  • 4.构造方法
    • 4.1使用构造方法向成员变量赋值
  • 5.其他内置方法
    • 5.1__str__字符串方法
    • 5.2__lt__小于符号比较方法
    • 5.3__le__小于等于比较符号
    • 5.4__eq__比较运算符实现方法
  • 6.封装
    • 6.1封装的概念
    • 6.2私有成员的使用
  • 7.继承
    • 7.1继承的概念
    • 7.2复写和使用父类成员
  • 8.类型注解
    • 8.1变量的类型注解
    • 8.2函数(方法)的类型注解
    • 8.3 Union类型
  • 9.多态

1.初识对象

1.1理解使用对象完成数据组织的思路

思考🤔?
学校开学,要求学生填写自己的基础信息,一人发一张白纸,让学生填写
在这里插入图片描述
改为使用登记表,打印出来让学生自行填写:
在这里插入图片描述
在程序中简单使用变量来记录学生信息
在这里插入图片描述
使用变量记录数据太乱了。
如果程序中也和生活中一样

  • 可以设计表格
  • 可以将设计的表格打印出来
  • 可以将打印好的表格供人填写内容
    那么数据的组织就非常方便了。

使用对象组织数据
在程序中可以做到和生活中那这样,设计表格,生产表格和填写表格的组织形式的
1.在程序中设计表格,我们称之为:设计类(class)

class Studen:name = None   #记录学生姓名

2.在程序中打印生产表格,我们称之为:创建对象

# 基于类创建对象
stu1 = Student()
stu2 = Student()

3.在程序中填写表格,我们称之为:对象属性赋值

stu_1.name = "周杰轮"  # 为学生1对象赋予名称属性值
stu_2.name = "林军杰"  # 为学生2对象赋予名称属性值

2.成员方法

2.1类的定义和使用语法

class 类名称 class是关键字,表示要定义类了
类的属性 类的属性,即定义在类中的变量(成员变量)
类的行为 类的行为,即定义在类中的函数(成员方法)

创建类对象的语法
对象 = 类名称()
在这里插入图片描述

class Student:name = None # 学生的姓名age = None # 学生的年龄def say_hi(self):print(f"Hi大家好,我是{self.name}")
stu = Student()
stu.name = "周杰轮"
stu.say_hi()   # 输出: Hi大家好,我是周杰轮

从上述代码中可以得出

  • 不仅可以定义属性来记录数据
  • 也可以定义函数,用来记录行为
  • 类中定义的属性(变量),我们称之为:成员变量
  • 类中定义的行为(函数),我们称之为:成员方法

定义在类内部的函数称之为方法

2.2成员方法的使用

在类中定义成员方法和定义函数基本一致,但仍有细微的区别:

def 方法名(self,形参1 ....,形参N):方法体

可以得出,在方法定义的参数列表中,有一个:self关键字self关键字是成员方法定义的时候,必须填写的。

  • 它用来表示类对象自身的意思
  • 当我们使用类对象调用方法的是,self会自动被Python传入
  • 在方法内部,想要访问类的成员变量,必须使用self

注意事项
self关键字,尽管在参数列表中,但是传参的时候可以忽略它

class Student:name = Nonedef say_hi(self):print(f"Hello,大家好")def say_hi2(self,msg):print(f"大家好!{msg}")
stu = Student()
stu.say_hi()  # 调用的时候,无需传参
stu.say_hi2("很高兴认识大家")  # 调用的时候,需要传msg参数

在传入参数的时候,self是透明的,可以不用理会他。

3.类和对象

现实世界的事务和类
在这里插入图片描述
类和对象描述现实事务
在这里插入图片描述
程序中通过类来描述
在这里插入图片描述
基于类创建对象
在这里插入图片描述

4.构造方法

4.1使用构造方法向成员变量赋值

class Student:name = None  # 名称age = None   # 年龄tel = None   # 手机号
stu1 = Student()
stu1.name = "周杰轮"
stu1.age = 31
stu1.tel = "18012340000"stu2 = Student()
stu2.name = "周杰轮"
stu2.age = 31
stu2.tel = "18012340000"

思考🤔
上述代码中,为对象的属性赋值需要依次进行,略显繁琐。
有没有更加高的方式,一行代码完成?
这个括号,能否像函数(方法)那样,通过传参的形式对属性赋值?
使用构造方法: __init__()

  • 在创建类对象(构造类)的时候,会自动执行
  • 在创建类对象(构造类)的时候,将传入参数自动传递给__init__方法使用
class Student:name = None  # 可以省略age = None   # 可以省略tel = None   # 可以省略def __init__(self,name,age,tel)self.name = nameself.age = ageself.tel = telprint("Student类创建了一个对象")
stu = Student("周杰轮",31,"18500000000")

构造方法注意事项

  • 构造方法名称:init_,千万不要忘记init前后有两个下划线
  • 构造方法也是成员方法,不要忘记在参数列表中提供:self
  • 在构造方法内定义成员变量,需要使用self关键字
    • 这是因为:变量是定义在构造方法内部,如果要成为成员变量,需要用self来表示
      练习
      在这里插入图片描述
class Student:# 构造方法def __init__(self):self.name = input("请输入学生姓名:")self.age = int(input("请输入学生年龄:"))self.address = input("请输入学生地址:")for i in range(1, 11):print(f"当前录入第{i}位学习信息,总共需录入10位学习信息")stu = Student()print(f"学生{i}信息录入完成,信息为:【学生姓名:{stu.name}, 年龄:{stu.age}, 地址:{stu.address}")

5.其他内置方法

5.1__str__字符串方法

class Student:def __init__(self,name,age):self.name = nameself.age =  age
stu = Student("周杰伦",25)
print(stu)
print(str(stu))
# 输出
<__main__.Student object at 0x000001E952802150>
<__main__.Student object at 0x000001E952802150>

当类对象需要被转换为字符串时,会输出如上结果(内存地址)
内存地址没多大用,我们可以通过__str__方法,控制类转换为字符串的行为。

class Student:def __init__(self,name,age):self.name = nameself.age =  agedef __str__(self):return f"Student类对象,name={self.name},age={self.age}"stu = Student("周杰伦",25)
print(stu)
print(str(stu))
# 输出
Student类对象,name=周杰伦,age=25
Student类对象,name=周杰伦,age=25

5.2__lt__小于符号比较方法

class Student:def __init__(self,name,age):self.name = nameself.age =  age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 < stu2)

直接两个对象比较是不可以的,但是在类中实现__lt__方法,即可同时完成:小于符号和大于符号 两种比较

class Student:def __init__(self,name,age):self.name = nameself.age =  agedef __lt__(self, other):return self.age < other.age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 < stu2)
# 返回值 True或者False

5.3__le__小于等于比较符号

class Student:def __init__(self,name,age):self.name = nameself.age =  agedef __le__(self, other):return self.age <= other.age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 <= stu2) # 结果 True
print(stu1 >= stu2) # 结果 False

5.4__eq__比较运算符实现方法

class Student:def __init__(self,name,age):self.name = nameself.age =  agedef __eq__(self, other):return self.age == other.age
stu1 = Student("周杰伦",25)
stu2 = Student("林俊杰",30)
print(stu1 == stu2)
  • 不实现__eq__方法,对象之间可以比较,但是是比较内存地址,也即是:不同对象==比较一定是False结果
  • 实现了__eq__方法,就可以按照自己的想法来决定2个对象是否相等了

6.封装

6.1封装的概念

封装表示的是,将现实世界事物的

  • 属性
  • 行为

封装到类中,描述为

  • 成员变量
  • 成员方法

从而完成程序对现实世界事物的描述
在这里插入图片描述

6.2私有成员的使用

在这里插入图片描述
私有成员的语法

  • 私有成员的变量:变量名以__开头(2个下划线)
  • 私有成员的方法:方法名以__开头(2个下划线)
class Phone:IMEI = None  # 序列号producer = None  # 厂商__current_voltage = 0.5  # 当前电压  私有成员变量def call_by_5g(self):print("5g通话已开启")def __keep_single_core(self):  # 私有成员方法print("让cpu以单核模式运行以节省电量")
phone = Phone()
phone.call_by_5g()

注意事项

  • 私有方法无法直接被类对象使用
  • 私有变量无法赋值,也无法获取值

使用私有成员
私有成员无法被类对象使用,但是可以被其他的成员使用

class Phone:IMEI = None  # 序列号producer = None  # 厂商__current_voltage = 1  # 当前电压  私有成员变量def call_by_5g(self):if  self.__current_voltage >= 1:self.__keep_single_core()print("5g通话已开启")def __keep_single_core(self):  # 私有成员方法print("让cpu以单核模式运行以节省电量")
phone = Phone()
phone.call_by_5g()
# 输出
让cpu以单核模式运行以节省电量
5g通话已开启

练习
在这里插入图片描述

class Phone:__is_5g_enable = False  # True表示5g开启,False表示5g关闭def __check_5g(self):if self.__is_5g_enable ==True:print("5g开启")else:print("5g关闭,使用4g网络")def call_by_5g(self):self.__check_5g()print("正在通话中")
phone = Phone()
phone.call_by_5g()
# 输出
5g关闭,使用4g网络
正在通话中

7.继承

7.1继承的概念

在这里插入图片描述
思考🤔?
如果你是设计师,你会如何选择?
1.每一代新款手机,都从零开始设计
2.基于老款的设计,修修改改
设计新手机基于老款的基础上进行修改

class Phone:IMEI = Noneproducer = "ITCAST"def call_by_4g(self):print("4g通话")class Phone2024(Phone):face_id = '10001'def call_by_5G(self):print("2024新功能:5g通话")

单继承
语法:

class 类名(父类名)类内容体

多继承
在这里插入图片描述

语法:

class 类名(父类1,父类2...父类3)类内容体
class Phone:IMEI = Noneproducer = "ITCAST"def call_by_4g(self):print("4g通话")
class NFCReader:nfc_type = "第五代"producer = "HM"def read_card(self):print("NFC读卡")def write_card(self):print("NFC写卡")
class RemoteControl:rc_type = "红外遥控"def control(self):print("红外")
class Myphone(Phone,NFCReader,RemoteControl):passphone = Myphone()
print(phone.producer)
phone.call_by_4g()
phone.read_card()
# 输出
ITCAST
4g通话
NFC读卡
父类的品牌是ITCAST
父类的5g通话
ITCAST

7.2复写和使用父类成员

复写
子类继承父类成员属性和成员方法,如果对其“不满意”,那么可以进行复写。
即:在子类重新定义同名的属性或方法即可。

class Phone:IMEI = Noneproducer = "ITCAST"def call_by_5g(self):print("父类的5g通话")
class Myphone(Phone):producer = "HM"def call_by_5g(self):print("子类的5g通话")phone = Myphone()
print(phone.producer)
phone.call_by_5g()
# 输出
HM
子类的5g通话

调用父类成员

class Phone:IMEI = Noneproducer = "ITCAST"def call_by_5g(self):print("父类的5g通话")
class Myphone(Phone):producer = "HM"def call_by_5g(self):# 方式1 调用父成员print(f"父类的品牌是{Phone.producer}")Phone.call_by_5g(self)# 方式2 调用父类成员print(f"父类的品牌是{super().producer}")super().call_by_5g()print("子类的5g通话")

注意事项
方式1调用父类成员

  • 使用成员变量:父类名.成员变量
  • 使用成员方法:父类名.成员方法(self)

方式2调用父类成员

  • 使用成员变量:super().成员变量
  • 使用成员方法:super().成员方法()

8.类型注解

8.1变量的类型注解

主要功能:

  • 帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
  • 帮助开发者自身对变量进行类型注释

支持:

  • 变量的类型注解
  • 函数(方法)形参列表和返回值的类型注解

方法1

# 基础容器类型注解
my_list :list = [1,2,3]
my_tuple: tuple = (1,2,3)
mu_dict: dict = {"itheima":666}
# 容器类型详细注解
my_list: list[int] = [1,2,3]
my_tuple: tuple[int,str,bool] = (1,"itheima",True)
my_dict: dict[str,int] = {"itheima":666}
# 类对象类型注解
class Student:pass
stu: Student = Student()

方法2

# 在注释中进行类型注解
var_1 = random.randint(1,10) # type: int
var_2 = json.loads('{"name":"zhangsan"}') # type: dict[str,str]
def func():return 10
var_3 = func() # type: int 

注意:类型注解只是提示性的,并非决定性的。数据类型和注解类型无法对应也不会导致错误

8.2函数(方法)的类型注解

形参注解

def add(x:int,y:int):return x + y
add()

返回值注解

def func(data: list) -> list:return data
print(func())

8.3 Union类型

在这里插入图片描述

from typing import Union
my_list: list [Union[int,str]] = [1,2,"heima"]
def func(data: Union[int,str]) ->Union[int,str]:pass

9.多态

多态:指的是多种状态。完成某个行为是,使用不同的对象会得到不同的状态。
在这里插入图片描述
多态常作用在继承关系上.

比如

  • 函数(方法)形参声明接收父类对象
  • 实际传入父类的子类对象进行工作

即:

  • 以父类做定义声明
  • 以子类做实际工作
  • 用以获得同一行为, 不同状态

抽象类(接口)
在这里插入图片描述
举例

class  AC:def cool_wind(self):"""制冷"""passdef hot_wind(self):"""制热"""passdef wring_l_r(self):"""左右摆风"""pass
class Midea_AC(AC):def cool_wind(self):print("美的空调核心制冷科技")def hot_wind(self):print("美的空调电热丝加热")def wring_l_r(self):print("美的空调无风感左右摆风")
class GREE_AC(AC):def cool_wind(self):print("格力空调变频省电制冷")def hot_wind(self):print("格力空调电热丝加热")def wring_l_r(self):print("格力空调静音左右摆风")def make_cool(ac:AC):ac.cool_wind()midea = Midea_AC()
gree = GREE_AC()make_cool(midea)
make_cool(gree)# 输出
美的空调核心制冷科技
格力空调变频省电制冷

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

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

相关文章

VUE3相比VUE2升级了哪些内容

目录 一、Vue 3 、Vue 2 对比及提升项 二、 Vue 3 创建app.vue示例 三、Vue3 的setup、Vue2 的 data对比 一、Vue 3 、Vue 2 对比及提升项 性能提升&#xff1a;Vue 3 做了大量的优化工作&#xff0c;提升了运行时的性能。例如&#xff0c;在模板编译时进行的静态分析和优化…

如何把苹果手机中的备忘录导入到电脑?这种方法特别方便

作为苹果手机的忠实用户&#xff0c;我深知备忘录在日常生活中的重要性。它是我随手记下的灵感闪现&#xff0c;是工作会议的要点记录&#xff0c;更是生活中的小提醒和重要事务的备忘录。然而&#xff0c;有时我需要将这些信息从手机导入到电脑中&#xff0c;以便更方便地查看…

k8s的存储卷---数据卷

前言 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet 会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的状态&#xff08;镜像最初的状态&#xff09;重新启动。其…

【大数据OLAP引擎】StarRocks为什么快?

StarRocks的优势 StarRocks最初主要的优势是性能&#xff0c;当时在单表查询方面与性能标杆ClickHouse不相上下&#xff0c;而join优化特性使其在多表关联查询场景下的性能表现要远远优于ClickHouse&#xff0c;替换ClickHouse自然也就成了StarRocks的第一个目标。 而StarRoc…

three.js实现雷达扫描效果(纹理贴图)

three.js实现雷达扫描效果&#xff08;纹理贴图&#xff09; 图例 步骤 创建两个平面&#xff0c;分别纹理贴图&#xff0c;底图模型.add&#xff08;光波模型&#xff09;关闭材质的深度测试光波旋转 代码 <template><div class"app"><div ref&q…

【算法每日一练]-练习篇 #Tile Pattern #Swapping Puzzle # socks

目录 今日知识点&#xff1a; 二维前缀和 逆序对 袜子配对(感觉挺难的&#xff0c;又不知道说啥) Tile Pattern Swapping Puzzle socks Tile Pattern 331 题意&#xff1a;有一个10^9*10^9的方格。W表示白色方格&#xff0c;B表示黑色方格。每个(i,j)方的颜色由(i…

Unity真机Log工具 SRDebugger使用记录,GM布局管理

SRDebugger 官方文档安装及初始化常用设置选项布局选项快捷键选项高级设置 使用GM工具案例常用特性GM分组排序GM固定页签 官方文档 文档&#xff1a; https://www.stompyrobot.uk/tools/srdebugger/documentation/ 插件地址&#xff1a; https://assetstore.unity.com/package…

数据结构及单链表例题(下)

上次我们已经了解了单链表的数据结构定义以及创建单链表的两种方法,这节介绍几道例题. 文章目录 前言 一、已知L为带头结点的单链表,请依照递归思想实现下列运算 二、单链表访问第i个数据节点 三、在第i个元素前插入元素e 四、删除第i个结点 五、查找带头结点单链表倒数第…

TS 36.322 V12.0.0-过程

​本文的内容主要涉及TS 36.322&#xff0c;版本是C00&#xff0c;也就是V12.0.0。

构建安全可靠的系统:第十一章到第十五章

第三部分&#xff1a;实现系统 原文&#xff1a;Part III. Implementing Systems 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 一旦您分析并设计了您的系统&#xff0c;就该是实现计划的时候了。在某些情况下&#xff0c;实现可能意味着购买现成的解决方案。第十一章…

QT第1天

题目&#xff1a;点击按钮改变文字 需要增加一个count属性&#xff0c;并且只需要定义槽&#xff0c;信号函数已经内置好了 //widget.h#ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Wi…

[C++]多态

目录 C多态&#xff1a;&#xff1a; 多态的概念 多态的定义及实现 多态的构成条件 虚函数 虚函数的重写 虚函数重写的特例 C11 override和final 重载、重写重定义的对比 抽象类 概念 接口继承和实现继承 多态的原理 虚函数表 多态的原理 动态绑定和静态绑定 单继承和…

LeetCode 84:柱状图中的最大矩形

一、题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&#xff1a…

Jmeter+ant+Jenkins 接口自动化框架完整版

接口自动化测试单有脚本是不够的&#xff0c;我们还需要批量跑指定接口&#xff0c;生成接口运行报告&#xff0c;定位报错接口&#xff0c;接口定时任务&#xff0c;邮件通知等功能。批量跑指定接口&#xff1a;我们可以利用ant批量跑指定目录下的Jmeter脚本生成接口运行报告&…

vue3基础类型和引用类型,和store的使用

案例一&#xff1a; 如果我在store创建一个变量&#xff0c;是读取缓存key为name的数据&#xff0c; store.name 默认值是张三 # 声明一个变量 const title ref(store.name) # 然后修改title.value "李四"&#xff0c; # 问&#xff1a;打印store.name&#xff0…

怎么投稿各大媒体网站?

怎么投稿各大媒体网站&#xff1f;这是很多写作者及自媒体从业者经常面临的问题。在信息爆炸的时代&#xff0c;如何将自己的文章推送到广大读者面前&#xff0c;成为了一个不可避免的挑战。本文将为大家介绍一种简单有效的投稿方法——媒介库发稿平台发稿&#xff0c;帮助大家…

5,sharding-jdbc入门-sharding-jdbc广播表

执行sql #在数据库 user_db、order_db_1、order_db_2中均要建表 CREATE TABLE t_dict (dict_id BIGINT (20) NOT NULL COMMENT 字典id,type VARCHAR (50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 字典类型,code VARCHAR (50) CHARACTER SET utf8 COLLAT…

国产AI工具钉钉AI助理:开启个性化助手服务的新篇章

钉钉AI助理是钉钉平台的一项功能&#xff0c;它可以根据用户的需求提供个性化的AI助手服务。用户可以在AI助理页面一键创建个性化的AI助理&#xff0c;如个人的工作AI助理、旅游AI助理、资讯AI助理等。企业也可以充分使用企业所沉淀的知识库和业务数据&#xff0c;在获得授权后…

C#入门篇(一)

变量 顾名思义就是变化的容器&#xff0c;即可以用来存放各种不同类型数值的一个容器 折叠代码 第一步&#xff1a;#region 第二步&#xff1a;按tab键 14种数据类型 有符号的数据类型 sbyte&#xff1a;-128~127 short&#xff1a;-32768~32767 int&#xff1a;-21亿多~21亿多…

CHS_01.2.1.1+2.1.3+进程的概念、组成、特征

CHS_01.2.1.12.1.3进程的概念、组成、特征 进程进程的概念 进程的组成——PCB进程的组成——PCB进程的组成——程序段、数据段知识滚雪球&#xff1a;程序是如何运行的&#xff1f;进程的组成进程的特征 知识回顾与重要考点 从这个小节开始 我们会正式进入第二章处理机管理相关…