Python学习笔记——类、魔术方法

  • 食用说明:本笔记适用于有一定编程基础的伙伴们。希望有助于各位! 

类 

  • 类的运用很常见:在大部分情况下,对一些特有的对象,可以使用特定的类来指向它:
class Person:name = 'unknown'age = -1sex = 0partner = Nonedef __init__(self, name, age, sex, partner):self.name = nameself.age = ageself.sex = sexself.partner = partnerdef __log(self):print(self.name, self.age, self.sex, self.partner)def greet(self):print(f"hello, {self.name}")self.__log()p1 = Person('Polaris', 18, 1, None)
p2 = Person('PolarisX', 19, 1, p1)
p2.partner.greet()
  • 上处代码是一个比较完整的定义和实现
  • __init__方法是实例化方法,其中self是python关键字,用于指向Person类实例,类似JS中的this
  • __log方法是一个私有方法,通过双下划线定义私有方法和私有变量,当然也可以通过单下划线定义保护成员和保护方法,具体如下:
class Person:_id = -1name = 'unknown'age = -1sex = 0partner = Nonedef __init__(self, name, age, sex, partner):self._id = random.randint(0, 10000)self.name = nameself.age = ageself.sex = sexself.partner = partnerdef __log(self):print(self.name, self.age, self.sex, self.partner)def greet(self):print(f"hello, {self.name}")self.__log()def _getID(self):return self._idclass Teacher(Person):__tid = -1def __init__(self, name, age, sex, partner):super().__init__(name, age, sex, partner)self.__tid = random.randint(0, 10000)# 打印ID和TIDprint(super()._getID(), self.__tid)class Driver(Person):__did = -1def __init__(self, name, age, sex, partner):super().__init__(name, age, sex, partner)self.__did = random.randint(0, 10000)# 打印ID和TIDprint(super()._getID(), self.__did)t1 = Teacher('Polaris', 18, 1, None)
d1 = Driver('PolarisX', 20, 1, None)
  • 很显然私有方法和保护方法,均无法使用,但保护方法可以通过继承给子类使用
  • 继承类可以是多个,使用逗号隔开,优先会使用第一继承位的方法和成员,以防止继承多个类时的冲突
魔术方法

  • python内置了许多魔术方法,先说说str魔术方法 
class Teacher(Person):__tid = -1def __init__(self, name, age, sex, partner):super().__init__(name, age, sex, partner)self.__tid = random.randint(0, 10000)# 打印ID和TID# print(super()._getID(), self.__tid)def __str__(self):return f"Teacher(name={self.name}, age={self.age}, sex={self.sex}, partner={self.partner})"print(Person('Polaris', 18, 1, None))
print(Teacher('Polaris', 18, 1, None))>>> <__main__.Person object at 0x10291f050>
>>> Teacher(name=Polaris, age=18, sex=1, partner=None)
  •  上面的代码返回的结果是不一样的,如果我们不设置str魔术方法,返回的是对象的内存地址,而我们定义了方法后,则会按照我们定义的格式返回
  • 下面我们在说说重构类比较符,具体如下:
    # 重定义小于def __lt__(self, other):return self.age < other.age# 重定义等于def __eq__(self, other):return self.age == other.age# 重定义小于等于def __le__(self, other):return self.age <= other.aget1 = Teacher('Polaris', 22, 1, None)t2 = Teacher('PolarisX', 22, 1, None)print(t1 > t2)print(t1 == t2)print(t1 <= t2)>>> False
>>> True
>>> True
  • 上处代码,对比较符号进行了重构
类方法的复写

有些情况下,类的方法可能继承自父类,但父类的方法又不能满足新类的需求,我们可以实现复写:

class Phone2(Phone):def call_by_5g(self):if super()._check_5g():print('phone2 call by 5g')else:print('phone2 call by 4g')    phone2 = Phone2(True)
phone2.call_by_5g()>>> phone2 call by 5g
  • 上述代码中,对call_by_5g实现了复写
类型注解

类型注解和TS的类似,具体如下:

    num1: int = 1num2: float = 1.2str1: str = 'hello'bool1: bool = Truelist1: list[int, float] = [1, 2, 3]tuple1: tuple[int, bool] = (1, True)dict1: dict[str, int | str | bool] = {'name': 1, 'age': 18, 'tel': '123456789X', 'is_married': True}set1: set[int] = {1, 2, 3}num3 = 1  # type: intnum4 = 1.2  # type: floatstr2 = 'hello'  # type: strbool2 = True  # type: boollist2 = [1, 2, 3]  # type: list[int, float]tuple2 = (1, True)  # type: tuple[int, bool]dict2 = {'name': 1, 'age': 18, 'tel': '123456789X', 'is_married': True}  # type: dict[str, int | str | bool]set2 = {1, 2, 3}  # type: set[int]p1 = Person('Pole', 18, '123456789X', True)  # type: Person
  • python对类型实现两种注解方式,第一种‘:’注解,第二种注释注解
  • 即使用户不按照类型注解来传递值,也不会报错,但不推荐虚假注解
from typing import Union    dict3: dict[str, Union[bool, str]] = {'name': 'p1'}
  • 有些时候我们可能会有多个类型变量,此时使用Union可以很好的解决联合类型的问题
多态
class Person:def speak(self):passclass Teacher(Person):def speak(self):print('Teacher speak')class Driver(Person):def speak(self):print('Driver speak')def speakSth(p: Person):p.speak()p1 = Person()t1 = Teacher()d1 = Driver()speakSth(p1)speakSth(t1)speakSth(d1)>>> Teacher speak
>>> Driver speak
  • 上述代码是一个简单的多态应用,常用于继承方法的不同实现
  • 其中一个类中的方法无具体实现,则这就是抽象类

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

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

相关文章

微信小程序三种授权登录以及授权登录流程讲解

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…

小县城蔬菜配送小程序制作全攻略

随着互联网的普及和人们对生活品质要求的提高&#xff0c;越来越多的小县城开始开发蔬菜配送小程序&#xff0c;以满足当地居民对新鲜蔬菜的需求。制作一个小县城蔬菜配送小程序&#xff0c;需要经过以下步骤&#xff1a; 步骤一&#xff1a;登录乔拓云平台 首先&#xff0c;打…

揭开 Amazon Bedrock 的神秘面纱 | 基础篇

在 2023 年 4 月&#xff0c;亚马逊云科技曾宣布将 Amazon Bedrock 纳入使用生成式人工智能进行构建的新工具集。Amazon Bedrock 是一项完全托管的服务&#xff0c;提供各种来自领先 AI 公司&#xff08;包括 AI21 Labs、Anthropic、Cohere、Stability AI 和 Amazon 等&#xf…

Android音视频开发之基础知识

一、视频文件 1、视频格式 常见格式&#xff1a;mp4、mkv、flv 封装的数据&#xff1a;音频码流、视频码流 常用工具&#xff1a; [FFmpeg下载]:https://ffmpeg.org/download.html 下载、安装并配置环境变量 ffmpeg.exe 视频编解码 ffplay.exe 播放器库 ffprobe.exe 音视频分…

git(部分)

1、git三个区域&#xff1a;工作区&#xff0c;暂存区&#xff0c;版本库 2、git文件状态&#xff1a;未跟踪&#xff0c;已跟踪&#xff08;新添加&#xff0c;未修改&#xff0c;已修改&#xff09; 如何查看暂存区和工作区文件状态&#xff1a;git status -s 3、查看版本记…

mysql MVC jsp实现表分页

mysql是轻量级数据库 在三层架构中实现简单的分页 在数据库sql编程中需要编写sql语句 SELECT * FROM sys.student limit 5,5; limit x,y x是开始节点&#xff0c;y是开始节点后的需要显示的长度。 在jdbc编程中需要给出x和y 一般是页数*页码&#xff0c;显示的长度。 代…

【(数据结构)—— 基于单链表实现通讯录】

&#xff08;数据结构&#xff09;—— 基于单链表实现通讯录 一.通讯录的功能介绍1.基于单链表实现通讯录(1). 知识要求(2). 功能要求 二.通讯录的代码实现1.通讯录的底层结构(单链表)(1).思路展示(2).底层代码实现(单链表)1.单链表头文件 —— &#xff08;函数的定义&#x…

【分类讨论】CF1747D

Problem - D - Codeforces 题意 思路 一看这个做法一定就是分类讨论 先判无解 显然&#xff0c;如果区间异或和不是0一定无解 如果区间内全是0&#xff0c;答案一定是0 之后怎么讨论 注意到需要讨论区间长度 如果长度是奇数&#xff0c;那么直接操作即可&#xff0c;答…

Top 10 数据恢复工具,可从iPhone 和 iPad 恢复数据

您是否正在寻找最好的 iPad 恢复软件&#xff0c;但不知道哪个选项最好&#xff1f;没有什么可担心的。本文将为您提供有关根据文件类型、设备兼容性和数据丢失原因等因素选择合适的 iPad 恢复软件的提示。此外&#xff0c;前 10 名提到的恢复软件是安全可靠的。 第 1 部分、iP…

ArmSoM-W3之RK3588硬编解码MPP环境配置

1. 简介 瑞芯微提供的媒体处理软件平台&#xff08;Media Process Platform&#xff0c;简称 MPP&#xff09;是适用于瑞芯微芯片系列的 通用媒体处理软件平台。该平台对应用软件屏蔽了芯片相关的复杂底层处理&#xff0c;其目的是为了屏蔽不 同芯片的差异&#xff0c;为使用者…

基于Java+Springboot+Vue前后端分离的商品库存销售管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 当今社会&#xff0c;…

Python--循环中的两大关键词 break 与 continue

在Python循环中&#xff0c;经常会遇到两个常见的关键词&#xff1a;break 与 continue break&#xff1a;代表终止整个循环结构 continue&#xff1a;代表中止当前本次循环&#xff0c;继续下一次循环 break&#xff1a; 英 /breɪk/ v. 打破&#xff0c;打碎&#xff0c…

看《软能力》的读后感

最近在图书大夏看了一本书的一部分&#xff0c;书名是《软能力》。本人看到了几个有意思的观点。一是接一些兼职项目。 二是分享自己的技术&#xff0c;让同事能干自己的工作&#xff0c;让自己的工作变得别人也能干&#xff0c;才有机会让自己的职位提升。 三是让手动操作变…

使用imx 8m 测试matter协议功能

参考网址&#xff1a; https://github.com/nxp-imx/meta-matter 请使用Ubuntu-20.04。18.04python版本太老 注意repo会出现此报错&#xff0c;可以无视&#xff1a; git checkout imx_matter_2023_q3 这一步在这个目录下操作 项目交流、学习、开发&#xff0c;欢迎私信。

【RNA biology】RNA的多功能性与早期生命进化

文章目录 RNARNA plays core functions in Central Dogma of BiologyrRNAsnRNA RNA worldReplication催化作用感知环境变化并作出响应 来自Manolis Kellis教授&#xff08;MIT计算生物学主任&#xff09;的课 油管链接&#xff1a;6.047/6.878 Lecture 7 - RNA folding, RNA wo…

TCP和UDP的原理及其区别(三次握手、四次挥手)

TCP和UDP都是在传输层上工作的协议&#xff0c;用于在网络中传输数据。 1、TCP和UDP之间的区别 TCP和UDP的主要区别在于它们提供的服务和特性。TCP提供可靠的、有序的、基于连接的数据传输&#xff0c;适用于对数据完整性和可靠性要求较高的应用&#xff08;邮件、短信&#xf…

Java多线程编程

文章目录 Java多线程编程线程概念线程常用方法线程创建线程优先级终止线程等待线程线程状态线程安全synchronizedvolatilewait和notify方法ThreadLocal的使用标准库线程安全类 Java多线程编程 线程概念 线程概念&#xff1a; 一个线程就是一个 “执行流”. 每个线程之间都可…

Springboot-案例 增删改查二

准备 前端程序、后端工程&#xff08;web/mybatis/mysql/lombok&#xff09;、数据库 开发规范 GET&#xff1a;查询 POST&#xff1a;新增 PUT&#xff1a;修改 DELETE&#xff1a;删除 Result.java Data NoArgsConstructor AllArgsConstructor public class Result {pri…

偶数科技发布实时湖仓数据平台Skylab 5.3版本

近日&#xff0c; 偶数发布了最新的实时湖仓数据平台 Skylab 5.3 版本。Skylab包含七大产品&#xff0c;分别为云原生分布式数据库 OushuDB、数据分析与应用平台 Kepler、数据资产管理平台 Orbit、自动化机器学习平台 LittleBoy、数据工厂 Wasp、数据开发与调度平台 Flow、系统…

鸿蒙HarmonyOS应用开发:扫描仪文件扫描

华为鸿蒙HarmonyOS已经发展到4.0&#xff0c;使用ArkTS作为开发语言。这篇文章结合Dynamsoft Service开发一个简单的鸿蒙应用&#xff0c;用来获取办公室里连接PC的扫描仪(惠普&#xff0c;富士通&#xff0c;爱普生&#xff0c;等)&#xff0c;把文档扫描到手机里。 准备工作…