【黑马程序员】Python面向对象

文章目录

  • 面向对象
    • 对象初始对象
    • 类的定义和使用
      • 语法
      • 代码示例
    • 内置方法
      • 构造方法
      • 字符串方法
      • 比较方法
        • `__lt__`方法
        • `__le__`方法
        • `__eq__`方法
    • 封装
      • 私有成员
      • 使用私有成员
    • 继承
      • 单继承
      • 多继承
      • 重写父类成员方法
      • 调用父类同名成员
    • 类型注解
      • 变量注解
        • 对变量设置类型注解
        • 在注释中进行类型注解
        • 类型注解的限制
      • 函数注解
      • union类型
    • 多态

面向对象

对象初始对象

  • 代码示例
# *_*coding:utf-8 *_*
# 设计一个类:类比生活中:设计一张登记表
class Student:# 定义类成员属性name = Nonegender = Nonenationality = Nonenative_place = Noneage = None# 创建一个对象:类比打印一张登记表
stu = Student()
# 对象属性进行赋值类比生活中填写表单
stu.name = "zsx"
stu.gender = "男"
stu.nationality = "China"
stu.native_place = "baoji"
stu.age = 18# 获取对象中记录的信息
print(f'姓名:{stu.name},性别:{stu.gender},国籍:{stu.nationality},出生地:{stu.native_place},年龄:{stu.age}')

类的定义和使用

语法

  • 类的定义

    • class:关键字,表示要定义类
    • 类的属性:类中的变量(成员变量)

    • 类的行为:类中的函数(成员方法)

class 类名:类的属性类的行为
  • 类的使用
对象=类名称()
  • 成员方法的定义语法

    • self关键字是成员方法定义时,必须填写的

    • 用来表示类对象自身,当我们使用类对象调用方法时,self会自动被Python传入

    • 在方法内部,想要访问类成员变量,必须使用self

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

代码示例

# *_*coding:utf-8 *_*
class Student:# 成员属性name = None# 成员方法def say_hi(self):print(f'hi, {self.name}')def say_hi1(self, msg):print(f'hi, {self.name}, {msg}')# 构建类对象
stu = Student()
# 给成员属性赋值
stu.name = "zs"
# 调用成员方法
stu.say_hi()
stu.say_hi1("你好")

内置方法

构造方法

  • python类可以使用:__init__()方法,称之为构造方法

  • 可以实现

    • 在创建类对象的时候,会自动执行

    • 在创建类对象的时候,会将传入参数自动传递给__init__方法使用

  • 代码示例

# *_*coding:utf-8 *_*
class Student:# 定义类成员属性name = Nonegender = Noneage = 0def __init__(self, name, gender, age):self.name = nameself.gender = genderself.age = agestu = Student("zsx", "man", 18)
print(f'姓名:{stu.name}, 性别:{stu.gender}, 年龄:{stu.age}')
  • 注意事项

    • 不要忘记前后两个下划线

    • 构造方法也是成员方法,不要忘记在参数列表中提供:self

    • 在构造方法内定义成员变量,需要使用self关键字

字符串方法

  • 问题:定义好类对象之后,如果直接打印类对象或者使用str强转打印,都会输出内存地址

  • 通过__str__方法可以控制类转换为字符串的行为

  • 代码示例:在上面类中添加__str__方法

    def __str__(self):return f'姓名:{self.name}, 性别:{self.gender}, 年龄:{self.age}'

比较方法

__lt__方法
  • 小于符号比较方法

  • 通过__lt__方法可以控制类中小于比较的行为

  • 代码示例

    def __lt__(self, other):return self.age < other.age
__le__方法
  • 小于等于符号比较方法

  • 通过__le__方法可以控制类中小于等于比较的行为

  • 代码示例

    def __le__(self, other):return self.age <= other.age
__eq__方法
  • 等于符号比较方法

封装

  • 将现实世界事务在类中描述为属性和方法,即为封装

私有成员

  • 在类中描述属性和方法有时候是不公开使用的

  • 定义私有成员的方法,在变量名或者方法名前面以__开头

  • 私有变量无法赋值,也无法使用

  • 代码示例

# *_*coding:utf-8 *_*class Phone:# 私有变量__curent_voltage = None  # 当前电压# 私有方法def __keep_single_core(self):print("cpu单核运行")phone = Phone()
# 访问私有成员,不报错,但无效
# AttributeError: 'Phone' object has no attribute '__curent_voltage'
print(phone.__curent_voltage)# 报错无法使用
# AttributeError: 'Phone' object has no attribute '__keep_single_core'
phone.__keep_single_core()

使用私有成员

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

  • 代码示例

# *_*coding:utf-8 *_*class Phone:# 私有变量__curent_voltage = 0.5  # 当前电压# 私有方法def __keep_single_core(self):print("cpu单核运行")def call_by_5g(self):if self.__curent_voltage >= 1:print("5g通话已开启")else:self.__keep_single_core()print("电量不足,无法使用5g通话")phone = Phone()
phone.call_by_5g()

继承

  • 定义:一个类继承另一个类的成员变量和成员方法

  • 子类构建的类对象

    • 有自己的成员变量和成员方法

    • 可以使用父类的成员变量和成员方法

单继承

  • 一个类继承自一个父类

  • 语法

class 类名(父类名):类内容
  • 代码示例
# *_*coding:utf-8 *_*
class Phone:IMEI = None  # 序列号producer = None  # 厂商def call_by_4g(self):print("4g通话")# 继承Phone类
class Phone2024(Phone):face_id = True  # 面部识别def call_by_5g(self):print("5g通话")p2024 = Phone2024()
p2024.call_by_4g()
p2024.call_by_5g()

多继承

  • 一个类可以继承多个父类

  • 注意事项

    • 多个父类中,如果有同名的成员,默认以从左到右为优先级
  • 语法

class 类名(父类1,父类2, ... ):类内容
  • 代码示例
# *_*coding:utf-8 *_*
class Phone:IMEI = Noneproducer = "HM2"def call_by_5g(self):print("5g通话")class NFCReader:nfc_type = "第5代"producer = "HM1"def read_card(self):print('读取nfc卡')def write_card(self):print('写入nfc卡')class RemoteControl:rc_type = "红外遥控"def control(self):print("红外遥控开启")class XiaoMePhone(Phone, NFCReader, RemoteControl):# pass表示空,只做语法不全,没有实际含义passmy_phone = XiaoMePhone()
my_phone.call_by_5g()
my_phone.read_card()
my_phone.write_card()
my_phone.control()
# 多个类有同名属性时优先级为从左向右
print(my_phone.producer)

重写父类成员方法

  • 子类对父类已有的方法进行重新定义

  • 代码示例

# *_*coding:utf-8 *_*
class Phone:def call_5g(self):print("使用5g通话")class MyPhone(Phone):# 子类对父类的方法进行重写def call_5g(self):print("使用升级5g通话")my_phone = MyPhone()
my_phone.call_5g()

调用父类同名成员

  • 一旦重写了父类成员,那么类对象调用成员的时候,就会调用重写后的新成员

  • 如果需要使用被复写的父类成员,需要特殊的调用

  • 语法

# 方式一:使用父类名调用
使用成员变量:父类名.成员变量
使用成员方法:父类名.成员方法(self)# 方式二:使用super()调用父类成员
使用成员变量:super().成员变量
使用成员方法:super().成员方法(self)
  • 代码示例
# *_*coding:utf-8 *_*
class Phone:id = 1def call_5g(self):print("使用5g通话")class MyPhone(Phone):id = 2# 子类对父类的方法进行重写def call_5g(self):print("使用升级5g通话")# 方式一:调用父类成员print(f'父类id:{Phone.id}')print(f'父类id:{Phone.call_5g(self)}')# 方式二:调用父类成员print(f'父类id:{super().id}')print(f'父类id:{super().call_5g()}')my_phone = MyPhone()
my_phone.call_5g()

类型注解

  • 定义:在代码中涉及数据交互的地方,提供数据类型的注解(显式说明)

  • 功能:

    • 帮助第三方IDE工具对代码进行类型推断,协助做代码提示

    • 帮助开发者自身对变量进行类型注解

  • 支持

    • 变量的类型注解

    • 函数形参列表和返回值的类型注解

变量注解

对变量设置类型注解
  • 语法:变量:类型

  • 代码示例

# *_*coding:utf-8 *_*
# 基础数据类型注解
var1: int = 10
var2: float = 3.12
var3: bool = True
var4: str = "sgfdghs"class Student:pass# 类对象类型注解
stu: Student = Student()# 基础容器类型注解
my_list: list = [1, 2, 3]
my_tuple: tuple = (1, 2, 3)
my_set: set = {1, 2, 3}
my_dict: dict = {"a": 1}
my_str: str = "dhsdjs"# 容器类型详细注解
my_list1: list[int] = [1, 2, 3]
my_tuple1: tuple[int, bool, str] = (1, True, "dsd")
my_set1: set[int] = {1, 2, 3}
my_dict1: dict[str, int] = {"a": 1}
在注释中进行类型注解
  • 语法:#type:类型

  • 代码示例

var1 = 1  # type: int
var2 = 4.56  # type: float
var3 = "sdas"  # type: st
类型注解的限制
  • 类型注解只是个提示,标记错了也没有关系
var1: int = "dasdsads"
var2: float = 3
var3: bool = 12321

函数注解

  • 语法:
def 函数名(形参: 类型, ..., 形参: 类型) -> 返回值类型:pass
  • 代码示例
def add(x: int, y: int) -> int:return x + ydef func(data: list) -> list:pass

union类型

  • 同时对多个类型进行注解

  • 代码示例

# *_*coding:utf-8 *_*
from typing import Union# 只是单类型的注解
my_list: list[int] = [1, 2, 3, 4]
my_dict: dict[str, int] = {"age": 12, "num": 1}# 存在混合类型的注解# Union[int, bool, float] 类型有可能是int, bool, float
my_list1: list[Union[int, bool, float]] = [1, True, 4.12]
my_dict1: dict[str, Union[str, int, float]] = {"name": "zs", "age": 12, "score": 85.5}

多态

  • 完成某个行为时,使用不同的对象会得到不同的状态

  • 代码示例

# *_*coding:utf-8 *_*
# 抽象类:含有抽象方法的类
class Animal:# 抽象方法:方法体是空实现(pass)def speak(self):passclass Cat(Animal):def speak(self):print("cat speak")class Dog(Animal):def speak(self):print("dog speak")def do_speak(animal: Animal):animal.speak()do_speak(Cat())
do_speak(Dog())

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

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

相关文章

文本生成解码策略及其在transformers中的代码实现

诸神缄默不语-个人CSDN博文目录 开放式文本生成会偏好采样方法。 由于我要下班了&#xff0c;所以本文主要就写了第五节。别的内容请大家参考第六节给出的参考资料。 文章目录 1. 贪心搜索2. beam search3. top-k sampling4. top-p sampling5. 代码实践&#xff1a;transform…

解决ffmpeg播放摄像头延时的问题(项目案例使用有效)

第一1.目前使用的对接的海康威视的摄像机,并且采用的流媒体服务器NodeMediaServer 进行收数据流并发流数据。但是延时达到了20秒,所以客户看到的效果不是很乐观,没有办法,只能开始优化播放延时的问题,至于对接摄像头的方案有好几种。我这种情况是时间没有延迟只有画面是有…

vue 引用百度地图

address.vue <template><div><!-- 地图 --><el-drawer:visible.sync"type1"direction"rtl"size"50%"append-to-bodyclass"map-drawer":before-close"beforeClose"><div style"width: 100%…

CSS:过渡动画 (Transition)与关键帧动画(Keyfram)

一、过渡动画 (Transition) 1.简单介绍 Transition能为样式的变化提供过渡效果&#xff0c;例如在下面的代码中&#xff1a; .main {width: 300px;height: 100px;background-color: #d26f6f;}.main:hover {width: 300px;height: 200px;background-color: #5e3e3e;transition:…

语义分割前言

1.常见数据集 1.1PASCAL VOC 其标注图片为单通道图像&#xff0c;其0~255像素值为其取值范围&#xff0c;背景为0&#xff0c;目标区域内根据目标的类别索引信息进行填充。 1.2MS COCO 其标注图像的标注文件为坐标信息。 官网有给出一个关于标注文件的格式说明&#xff0…

数字信封

一、概念 数字信封是将对称密钥通过非对称加密&#xff08;即&#xff1a;有公钥和私钥两个&#xff09;的结果分发对称密钥的方法。数字信封是实现信息保密性验证的技术。 二、过程描述 在数字信封中&#xff0c;信息发送方采用对称密钥来加密信息内容&#xff0c;然后将此…

考虑源荷随机特征的热电联供微网优化(含matlab程序)

目录 一、前言 二、含可再生能源的CHP型微网系统 三、CCP理论 四、具体模型 五、不含随机变量分析的matlab程序设计 1.粒子群寻优功能代码段 2.目标函数子程序 3.其他代码段 六、基于CCP的粒子群优化程序 1.含随机变量的约束条件处理 2.随机变量生成 3.置信水平检验部…

知识点回顾梳理之Linux常用指令

文章目录 &#x1f412;个人主页&#xff1a;信计2102罗铠威&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a; &#x1f380;点击这里&#xff1a;Linux命令大全入口&#x1f380;Linux的目录结构&#x1f415;文件作用&#x1fa80;Linux常用命令&#x1f380;关机 …

在IDE中配置tomcat服务器

目录 一、新建一个java项目二、添加web框架三、配置tomcat服务器四、运行访问发布的项目 前言&#xff1a;在 IntelliJ IDEA 中配置 Tomcat 服务器是 Java Web 开发的基础步骤&#xff0c;以下是如何在 IDEA 中设置 Tomcat 并部署 Web 项目的简要指南。 一、新建一个java项目 新…

用两个栈实现简单的四则运算

题目要求&#xff1a;给定一个字符串如“12*3”,没有括号&#xff0c;要求利用栈的知识来处理结果算出答案 我的思路&#xff1a;建立两个栈&#xff0c;一个存放数据&#xff0c;一个存放符号&#xff0c;再定义一个结构体做为操作的主体&#xff0c;然后制作几个函数&#x…

[蓝桥杯]-最大的通过数-CPP-二分查找、前缀和

目录 一、题目描述&#xff1a; 二、整体思路&#xff1a; 三、代码&#xff1a; 一、题目描述&#xff1a; 二、整体思路&#xff1a; 首先要知道不是他们同时选择序号一样的关卡通关&#xff0c;而是两人同时进行两个入口闯关。就是说两条通道存在相同关卡编号的的关卡被通…

大一专科,物联网专业,变态成长偏方!

最近看到一个大一&#xff0c;物联网专业的学生提问&#xff1a; 印象中&#xff0c;物联网专业2011年才有的&#xff0c;正好是我毕业那年。 我大概看过物联网专业要学的内容&#xff0c;总结下来就是&#xff0c;比软件不如计算机&#xff0c;比硬件知识不如电子。 不知道老师…

3.15作业

什么是IP地址&#xff1a;IP地址的作用是在网络中唯一标识和定位设备 IP地址和MAC地址的区别&#xff1a;IP地址是逻辑地址&#xff0c;网络层标识设备&#xff0c;可以更改&#xff0c;是全球互联网的唯 一 标识 MAC地址是物…

已解决:android SDK安装时点击SDK Manager出现闪退

1、首先确保电脑里边安装了JDK&#xff0c;并且要把安装路径配置在环境变量里边&#xff0c;避免使用绝对路径 推荐%JAVA_HOME%\bin 2、在C:\Users\huanhuan\Desktop\android-sdk-windows\tools路径下找到android.bat文件打开&#xff0c;把set java_exe后改为jdk中java.exe的路…

Day40-45 网络高级(modbus)

文章目录 Modbus起源1.起源&#xff1a;2.分类&#xff1a;3.优势&#xff1a;4.应用场景&#xff1a;5.ModbusTCP特点&#xff1a; Modbus TCP协议格式1.报文头2.寄存器3.功能码 工具软件使用.Modbus Slave&Poll2.网络调试助手.Wireshark的使用 Modbus RTU1、与Modbus TCP…

阴阳四象八卦_学习笔记

个人学习笔记&#xff0c;自行斟酌阅读 太极 阴中有阳&#xff0c;阳中有阴 阴阳 太极生两仪 符号阴⚋阳⚊ 个人理解: 一划为天&#xff0c;中间为太阳&#xff0c;看得见为阳&#xff0c;看不见为阴 四象 两仪生四象 符号符号解释阴阳少阳⚎晨时&#xff0c;天热地冷…

对服务划分,服务治理,服务分层的理解

服务划分是指将一个大型应用系统拆分为多个独立的服务&#xff0c;每个服务负责完成特定的业务功能。服务划分的目的是提高系统的可扩展性、可维护性和可测试性&#xff0c;同时也便于团队协作和开发效率。 服务治理是指对微服务架构中的服务进行管理和监控&#xff0c;确保服务…

Google Play上架:谷歌支付政策变更

目录 政策发布时间概括内容付款政策变动内容归纳google付款用户政策政策发布时间 2024 年 3 月 6 日 概括内容 为遵守《数字市场法案》(DMA) 的规定,从 2024 年 3 月 6 日起,我们将更新付款政策,允许开发者将欧洲经济区 (EEA) 的用户引导至其应用之外的平台(包括推广应用…