符合Python风格的对象(再谈向量类)
再谈向量类
为了说明用于生成对象表示形式的众多方法,我们将使用一个
Vector2d 类,它与第 1 章中的类似。这一节和接下来的几节会不断实
现这个类。我们期望 Vector2d 实例具有的基本行为如示例 9-1 所示。
示例 9-1 Vector2d 实例有多种表示形式
>>> v1 = Vector2d(3, 4)
>>> print(v1.x, v1.y) ➊
3.0 4.0
>>> x, y = v1 ➋
>>> x, y
(3.0, 4.0)
>>> v1 ➌
Vector2d(3.0, 4.0)
>>> v1_clone = eval(repr(v1)) ➍
>>> v1 == v1_clone ➎
True
>>> print(v1) ➏
(3.0, 4.0)
>>> octets = bytes(v1) ➐
>>> octets
b'd\\x00\\x00\\x00\\x00\\x00\\x00\\x08@\\x00\\x00\\x00\\x00\\x00\\x00\\x10@'
>>> abs(v1) ➑
5.0
>>> bool(v1), bool(Vector2d(0, 0)) ➒
❶ Vector2d 实例的分量可以直接通过属性访问(无需调用读值方
法)。
❷ Vector2d 实例可以拆包成变量元组。
❸ repr 函数调用 Vector2d 实例,得到的结果类似于构建实例的源
码。
❹ 这里使用 eval 函数,表明 repr 函数调用 Vector2d 实例得到的是
对构造方法的准确表述。
❺ Vector2d 实例支持使用 == 比较;这样便于测试。
❻ print 函数会调用 str 函数,对 Vector2d 来说,输出的是一个有
序对。
❼ bytes 函数会调用__bytes__ 方法,生成实例的二进制表示形式。
❽ abs 函数会调用__abs__ 方法,返回 Vector2d 实例的模。
❾ bool 函数会调用__bool__ 方法,如果 Vector2d 实例的模为零,
返回 False,否则返回 True。
示例 9-1 中的 Vector2d 类在 vector2d_v0.py 文件中实现(见示例 9-
2)。这段代码基于示例 1-2,除了 == 之外(在测试中用得到),其他
中缀运算符将在第 13 章实现。现在,Vector2d 用到了几个特殊方法,
这些方法提供的操作是 Python 高手期待设计良好的对象所提供的。
示例 9-2 vector2d_v0.py:目前定义的都是特殊方法
from array import array
import mathclass Vector2d:typecode = 'd' ➊def __init__(self, x, y):self.x = float(x) ➋self.y = float(y)def __iter__(self):return (i for i in (self.x, self.y)) ➌def __repr__(self):
class_name = type(self).__name__return '{}({!r}, {!r})'.format(class_name, *self) ➍def __str__(self):return str(tuple(self)) ➎def __bytes__(self):return (bytes([ord(self.typecode)]) + ➏
bytes(array(self.typecode, self))) ➐def __eq__(self, other):return tuple(self) == tuple(other) ➑def __abs__(self):return math.hypot(self.x, self.y) ➒def __bool__(self):return bool(abs(self)) ➓
❶ typecode 是类属性,在 Vector2d 实例和字节序列之间转换时使
用。
❷ 在__init__ 方法中把 x 和 y 转换成浮点数,尽早捕获错误,以防
调用 Vector2d 函数时传入不当参数。
❸ 定义__iter__ 方法,把 Vector2d 实例变成可迭代的对象,这样才
能拆包(例如,x, y = my_vector)。这个方法的实现方式很简单,
直接调用生成器表达式一个接一个产出分量。
这一行也可以写成 yield self.x; yield.self.y。第 14 章会进一步讨论__iter__ 特殊方
法、生成器表达式和 yield 关键字。
❹__repr__ 方法使用 {!r} 获取各个分量的表示形式,然后插值,构
成一个字符串;因为 Vector2d 实例是可迭代的对象,所以 *self 会把
x 和 y 分量提供给 format 函数。
❺ 从可迭代的 Vector2d 实例中可以轻松地得到一个元组,显示为一个
有序对。
❻ 为了生成字节序列,我们把 typecode 转换成字节序列,然后……
❼ ……迭代 Vector2d 实例,得到一个数组,再把数组转换成字节序
列。
❽ 为了快速比较所有分量,在操作数中构建元组。对 Vector2d 实例来
说,可以这样做,不过仍有问题。参见下面的警告。
❾ 模是 x 和 y 分量构成的直角三角形的斜边长。
❿__bool__ 方法使用 abs(self) 计算模,然后把结果转换成布尔
值,因此,0.0 是 False,非零值是 True。
示例 9-2 中的__eq__ 方法,在两个操作数都是 Vector2d
实例时可用,不过拿 Vector2d 实例与其他具有相同数值的可迭代
对象相比,结果也是 True(如 Vector(3, 4) == [3, 4])。这
个行为可以视作特性,也可以视作缺陷。第 13 章讲到运算符重载
时才能进一步讨论。
我们已经定义了很多基本方法,但是显然少了一个操作:使用 bytes()
函数生成的二进制表示形式重建 Vector2d 实例。
相关文章:
符合Python风格的对象(再谈向量类)
再谈向量类 为了说明用于生成对象表示形式的众多方法,我们将使用一个 Vector2d 类,它与第 1 章中的类似。这一节和接下来的几节会不断实 现这个类。我们期望 Vector2d 实例具有的基本行为如示例 9-1 所示。 示例 9-1 Vector2d 实例有多种表示形式 &g…...

云电竞服务器 工作原理
云电竞服务器工作原理详解 一、核心架构原理 虚拟化资源池 通过 KVM/VMware 等虚拟化技术将物理服务器(含NVIDIA GPU集群)抽象为可动态分配的算力资源池,每个用户独享独立虚拟机实例,实现硬件资源的按需分配与隔离运行。 …...

【数据结构】线性表--队列
【数据结构】线性表--队列 一.什么是队列二.队列的实现1.队列结构定义:2.队列初始化函数:3.队列销毁函数:4.入队列函数(尾插):5.出队列函数(头删):6.取队头元素ÿ…...

[Vue3]语法变动
Vue3的语法相对比Vue2有不少改变,这篇讲一下基础语法在Vue3里的形式。 创建Vue对象 在脚手架项目中,index.html等资源不再编写代码,只作为一个容器。所有的页面代码都在.vue相关文件中进行编写,由main.js引入各个.vue文件渲染出页…...

Ubuntu服务器开启SNMP服务 监控系统配置指南 -优雅草星云智控简易化操作
Ubuntu服务器开启SNMP服务 & 监控系统配置指南 -优雅草星云智控简易化操作 一、Ubuntu服务器开启SNMP服务 步骤1:安装SNMP服务 sudo apt update sudo apt install snmp snmpd snmp-mibs-downloader -y 步骤2:配置SNMP(编辑配置文件&am…...

linux本地部署ollama+deepseek过程
1.Tags ollama/ollama GitHub 选择一个版本下载,我下的是0.5.12 2.tar解压该文件 3.尝试启动ollama ollama serve 4.查看ollama的版本 ollama -v 5.创建一个系统用户 ollama,不允许登录 shell,拥有一个主目录,并且用…...

从零开始实现大语言模型(十五):并行计算与分布式机器学习
1. 前言 并行计算与分布式机器学习是一种使用多机多卡加速大规模深度神经网络训练过程,以减少训练时间的方法。在工业界的训练大语言模型实践中,通常会使用并行计算与分布式机器学习方法来减少训练大语言模型所需的钟表时间。 本文介绍PyTorch中的一种…...

OpenCV进阶操作:指纹验证、识别
文章目录 前言一、指纹验证1、什么是指纹验证2、流程步骤 二、使用步骤(案例)三、指纹识别(案例)1、这是我们要识别的指纹库2、这是待识别的指纹图3、代码4、结果 总结 前言 指纹识别作为生物识别领域的核心技术之一,…...

网络安全-等级保护(等保) 2-5 GB/T 25070—2019《信息安全技术 网络安全等级保护安全设计技术要求》-2019-05-10发布【现行】
################################################################################ GB/T 22239-2019 《信息安全技术 网络安全等级保护基础要求》包含安全物理环境、安全通信网络、安全区域边界、安全计算环境、安全管理中心、安全管理制度、安全管理机构、安全管理人员、安…...

3D生成新突破:阶跃星辰Step1X-3D开源,可控性大幅提升
Step1X-3D 是由 StepFun 联合 LightIllusions 推出的新一代 高精度、高可控性 3D资产生成框架。基于严格的 数据清洗与标准化流程,我们从 500万 3D资产 中筛选出 200万高质量数据,构建了 标准化的几何与纹理属性数据集,为3D生成提供更可靠的训…...

MySQL数据类型之VARCHAR和CHAR使用详解
在设计数据库字段时,字符串类型算是最常见的数据类型之一了,这篇文章带大家深入探讨一下MySQL数据库中VARCHAR和CHAR数据类型的基本特性,以及它们之间的区别。 VARCHAR类型 VARCHAR(Variable Character,可变长度字符…...
数字人 LAM 部署笔记
目录 windos踩坑 GitHub - aigc3d/LAM: [SIGGRAPH 2025] LAM: Large Avatar Model for One-shot Animatable Gaussian Head windos踩坑 nvidia-smi环境 cuda 11.8conda install -c "nvidia/label/cuda-11.8.0" cuda-toolkit conda create --name cuda11.8 -y pyth…...

《Docker 入门与进阶:架构剖析、隔离原理及安装实操》
1 docker 简介 1.1 Docker 的优点 Docker 是一款开放平台,用于应用程序的开发、交付与运行,能将应用和基础架构分离,实现软件快速交付 ,还能以统一方式管理应用和基础架构,缩短代码从编写到上线的时间。其核心优势如…...

基于Akamai云计算平台的OTT媒体点播转码解决方案
点播视频(VOD)流媒体服务依赖于视频流的转码来高效分发内容。在转码工作流程中,视频被转换为适合观看设备、网络条件和性能限制的格式。视频转码是计算密集型过程,因此最大化可用硬件上可转码的视频流数量是首要考虑因素。不同基础…...

【MySQL】02.数据库基础
1. 数据库的引入 之前存储数据用文件就可以了,为什么还要弄个数据库? 文件存储存在安全性问题,文件不利于数据查询和管理,文件不利于存储海量数据,文件在程序中控制不方便。而为了解决上述问题,专家们设计出更加利于…...

选错方向太致命,华为HCIE数通和云计算到底怎么选?
现在搞HCIE的兄弟越来越多了,但“数通和云计算,到底考哪个?”这问题,依旧让不少人头疼。 一个是华为认证的老牌王牌专业——HCIE数通,稳、系统、岗位多; 一个是新趋势方向,贴合云原生、数字化…...

经典启发算法【早期/启发式/HC爬山/SA模拟退火/TS禁忌搜/IA免疫 思想流程举例全】
文章目录 一、早期算法二、启发式算法三、爬山法HC3.1 基本思路3.2 伪代码 四、模拟退火SA4.1 算法思想4.2 基本流程4.3 再究原理4.3.1 Metropolis准则4.3.2 再理解 4.4 小Tips4.5 应用举例4.5.1 背包问题:分析:求解: 4.5.2 TSP问题ÿ…...

IntraWeb 16.0.2 + Bootstrap 4 居中布局实战(附源码+效果图)
前言 最近在优化一个 IntraWeb 16.0.2 项目时,发现默认布局方式不够灵活,尤其是在不同屏幕尺寸下对齐效果不佳。于是,我决定引入 Bootstrap 4 来实现 完美居中布局,并成功落地!今天就把完整的 源代码 实际效果图 分享…...
Spring 框架中适配器模式的五大典型应用场景
Spring 框架中适配器模式的应用场景 在 Spring 框架中,适配器模式(Adapter Pattern)被广泛应用于将不同组件的接口转化为统一接口,从而实现组件间的无缝协作。以下是几个典型的应用场景: 1. HandlerAdapter - MVC 请…...

【Java ee初阶】jvm(3)
一、双亲委派机制(类加载机制中,最经常考到的问题) 类加载的第一个环节中,根据类的全限定类名(包名类名)找到对应的.class文件的过程。 JVM中进行类加载的操作,需要以来内部的模块“类加载器”…...
C 语言多维数组:定义、初始化与访问的深度解析
各类资料学习下载合集 https://pan.quark.cn/s/8c91ccb5a474 在 C 语言中,我们已经熟悉了一维数组(存储线性数据)和二维数组(存储表格或矩阵数据)。但现实世界的数据结构往往更加复杂,例如表示空间中的点、图像数据、物理模拟的网格等。这时,就需要用到多维数…...
浅入ES5、ES6(ES2015)、ES2023(ES14)版本对比,及使用建议---ES6就够用(个人觉得)
JavaScript(ECMAScript)的发展经历了多个版本,每个版本都引入了新特性和改进。以下仅是对三个常用版本(ES5、ES6(ES2015) 和 ES2023)的基本对比及使用建议: 目前常见项目中还是用ES6…...

23种设计模式考试趋势分析之——适配器(Adapter)设计模式——求三连
文章目录 一、考点分值占比与趋势分析二、真题考点深入挖掘三、"wwwh"简述四、真题演练与解析五、极简备考笔记 适配器模式核心要点六、考点记忆顺口溜七、多角度解答 一、考点分值占比与趋势分析 由于知识库提供的真题年份信息不完整,我们仅能对现有数据…...
Python 翻译词典小程序
一、概述 本工具是基于Python开发的智能翻译系统,采用有道词典进行翻译,并具有本地词典缓存以及单词本功能。 版本号:v1.0 (2025-05-15) 二、核心功能说明 1. 基础翻译功能 即时翻译:输入英文单词自动获取中文释义 词性识别&…...

【Linux笔记】——线程互斥与互斥锁的封装
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:Linux 🌹往期回顾🌹:【Linux笔记】——Linux线程封装 🔖流水不争,争的是滔滔不息 一、线程互斥的概念二、互…...

Android屏幕采集编码打包推送RTMP技术详解:从开发到优化与应用
在现代移动应用中,屏幕采集已成为一个广泛使用的功能,尤其是在实时直播、视频会议、远程教育、游戏录制等场景中,屏幕采集技术的需求不断增长。Android 平台为开发者提供了 MediaProjection API,这使得屏幕录制和采集变得更加简单…...

【深度学习】残差网络(ResNet)
如果按照李沐老师书上来,学完 VGG 后还有 NiN 和 GoogLeNet 要学,但是这两个我之前听都没听过,而且我看到我导师有发过 ResNet 相关的论文,就想跳过它们直接看后面的内容。 现在看来这不算是不踏实,因为李沐老师说如果…...

《Python星球日记》 第94天:走近自动化训练平台
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、自动化训练平台简介1. Kubeflow Pipelines2. TensorFlow Extended (TFX) 二…...

S7 200 smart连接Profinet转ModbusTCP网关与西门子1200PLC配置案例
控制要求:使用MODBUSTCP通信进行两台PLC之间的数据交换,由于改造现场不能改动程序,只留出了对应的IQ地址。于是客户决定使用网关进行通讯把数据传到plc。 1、读取服务器端40001~40005地址中的数据,放入到VW200~VW208中࿱…...
React中巧妙使用异步组件Suspense优化页面性能。
文章目录 前言一、为什么需要异步组件?1. 性能瓶颈分析2. 异步组件的价值 二、核心实现方式1. React.lazy Suspense(官方推荐)2. 路由级代码分割(React Router v6) 总结 前言 在 React 应用中,随着功能复…...