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.rhkb.cn/news/165432.html

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

相关文章

逗号表达式

#include<stdio.h> int cmp() {return(2,1); } int main() {int z cmp();printf("%d",z);return 0; } 逗号表达式括号里的优先级是自左向右&#xff0c;最后一个值为最终的结果。

反向传播back propagation

深度学习概述 决定要怎么连接这些neuron的时候 就已经确定了function set 相比于之前做logistic regression&#xff0c;linear regression的时候&#xff0c;换一个方式来决定function set 比较大&#xff0c;包含了logistic regression&#xff0c;linear regression没法包含…

01、Python 安装 ,Pycharm 安装

目录 安装安装 Python安装 Pycharm 创建项目简单添加文件运行 简单爬取下载小视频 安装 python-3.8.10-amd64.exe – 先安装这个 pycharm-community-2022.2.exe 再安装这个 安装 Python python-3.8.10-amd64.exe 安装&#xff08;这个是其他版本的安装&#xff0c;步骤一样…

[C++]3.类和对象下(this指针补充)+ 类和对象中构造函数和析构函数。

类和对象下&#xff08;this指针补充&#xff09; 类和对象中构造函数和析构函数 一.this补充&#xff1a;1.概念总结&#xff1a;2.两个问题&#xff1a; 二.构造函数和析构函数&#xff1a;一.类的默认构造&#xff1a;1.初始化和清理&#xff1a;2.拷贝复制&#xff1a;3.取…

打卡go学习第一天

8.1 下面展示一些 代码。 package mainimport ("fmt""net""os""time" )type Clock struct {Name stringAddr string &#xff5d; func main() {clocks : []Clock{{Name: "New York", Addr: "localhost:8000"…

基于深度学习网络的蔬菜水果种类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1数据集准备 4.2构建深度学习模型 4.3模型训练 4.4模型评估 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 clc; clear; close all; wa…

如何更换微信公众号主体?

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;微信公众平台的帐号迁移功能可将原公众号的粉丝、文章素材、违规记录、留言功能、名称等迁移至新的公众号。通过迁移可以实现公众号的公司主体变更、粉丝转移、开通留言功能、服务号转为订阅号等作用。因此不止局限…

CAD Exchanger SDK 3.22.0 Crack

Docker 映像、Autodesk Inventor 2022 支持以及从 CAD Exchanger 3.22.0 中的 CATIA 导入属性 使用 Docker 映像将您的软件运送到任何地方&#xff0c;独立于 Autodesk 软件读取 .ipt、.iam 文件&#xff0c;从 CATIA 探索机械、产品和自定义属性。 软件开发工具包产品更新发明…

使用 Rust 开发:以太坊与 Layer2 生态建设新趋势

Rust 是一种系统编程语言&#xff0c;以其出色的性能、内存安全和并发性而闻名&#xff0c;在区块链和 Web3 中广泛应用&#xff0c;大多数编程语言和开发框架都以 Rust 为核心&#xff0c;如 Polkadot、Solana、NEAR、Elrond&#xff08;现名 MultiversX&#xff09;、Hyperle…

华为云文件上传(单个上传和分段上传)

首先引入静态文件&#xff1a; 华为云官网提供js下载的链接 然后后端提供一个公用接口&#xff0c;返回华为云上传的基本配置&#xff1a; 官网提供的链接&#xff1a;华为云obs信息配置 一&#xff1a;单个上传 huaweiyunUpload (file, fileName, name, url, size, callb…

13.3测试用例进阶

一.测试对象划分 1.界面测试(参考软件规格说明书和UI视觉稿) a.什么是界面 1)WEB站(浏览器) 2)app 3)小程序 4)公众号 b.测试内容 1)界面内容显示的一致性,完整性,准确性,友好性.比如界面内容对屏幕大小的自适应,换行,内容是否全部清晰展示. 2)验证整个界面布局和排版…

设计模式_中介者模式

中介者模式 介绍 设计模式定义案例问题堆积在哪里解决办法中介者代替了多个对象之间的互动 使对象1 2 3 之间的互动 变为&#xff1a; 对象1->中介 对象2->中介 对象3->中介好友之间 约饭好友1 通知 好友2 -3 -4 等等加一个群 谁想吃饭就 通知一下 类图 代码 角色 …

【ROS 2 Humble】 Ubuntu 20.04(Focal)平台 源码安装

提问链接&#xff1a; https://answers.ros.org/questions/ —————————————— ROS 1 各版本支持截止时间查看 ROS 1 支持时间查看 链接 https://wiki.ros.org/Distributions ROS 2 各版本支持截止时间查看 ROS 2 版本支持时间查看 ROS 2 https://docs.ros.…

element-ui中表格树类型数据的显示

项目场景&#xff1a; 1&#xff1a;非懒加载的情况 1&#xff1a;效果展示 2&#xff1a;问题描述以及解决 1&#xff1a;图片展示 2&#xff1a;html <-- default-expand-all 代表默认展开 如果不展开删除就行 --> <el-tableref"refsTable"v-loadin…

高速DSP系统设计参考指南(六)锁相环(PLL)

&#xff08;六&#xff09;锁相环&#xff08;PLL&#xff09; 1.模拟锁相环2.数字锁相环3.PLL隔离技术 系统设计人员需要隔离PLL&#xff0c;使其免受内部和外部噪声的影响。PLL通常用作频率合成器&#xff0c;将输入时钟乘以一个整数。该整数是反馈计数器M除以输入计数器N的…

Pytorch搭建DTLN降噪算法

前面介绍了几种轻量级网路结构的降噪做法&#xff0c;本文介绍DTLN—一种时频双核心网络降噪做法。 AI-GruNet降噪算法 AI-CGNet降噪算法 AI-FGNet降噪算法 Pytorch搭建实虚部重建AI-GruNet降噪算法 一、模型结构 DTLN来自[2005.07551] Dual-Signal Transformation LSTM N…

EPLAN_008#3D布局图

一、新建页 多线原理图纸画好以后 打开布局空间导航器——右键——新建 二、插入箱柜 菜单栏——插入——箱柜 三、显示安装板 然后调整视角 四、插入线槽 菜单栏——插入——线槽——选择合适的线槽——确定 按A键可以切换线槽方向&#xff0c;如果位置不对&#xff0c;可以再…

尝试使用jmeter-maven-plugin

前提准备 1、maven项目 2、已安装JMeter、Jenkins、maven、jdk 环境要求&#xff1a; jmeter>5.6.2 maven >3.9 jdk>1.8 Jenkins ? 备注&#xff1a;jmeter-maven-plugin 无需下载&#xff0c;可查阅相关地址&#xff1a;GitHub - jmeter-maven-plugin/jmete…

高效恢复丢失的文件的10 款Android数据恢复工具

在当今快节奏的数字时代&#xff0c;从Android设备丢失重要数据可能是一场噩梦。 您需要一个可靠的恢复工具来取回您的数据&#xff0c;例如令人难忘的照片&#xff0c;重要的联系人&#xff0c;重要的工作文档等。 值得庆幸的是&#xff0c;有许多高效的Android数据恢复工具可…

什么是无磁远传水表?工作原理是怎样的?

无磁远传水表是一种新型的智能水表&#xff0c;与传统水表相比&#xff0c;它具有更高的精度和可靠性&#xff0c;并且可以实现远程读数和控制。那么&#xff0c;无磁远传水表的工作原理是怎样的呢?下面&#xff0c;小编来为大家介绍下什么是无磁水表?它的工作原理是怎样的&a…