python-静态方法和类方法

Java之类的编程语言还带有静态方法,Python类也拥有与静态方法明确对应的方法。此外,Python还拥有类方法,要比静态方法更高级一些。

静态方法与Java一样,即便没有创建类的实例,静态方法也是可以调用的,当然通过类实例来调用也是可以的。请用@staticmethod装饰器来创建静态方法,如代码清单15-1所示。

因为Python的动态性,对语言没有加太多限制,所以其继承机制要比Java和C ++等编译型语言更加简单灵活。为了了解如何在Python中使用继承,可先从本章之前讨论过的Circle类开始,再推而广之。不妨再定义一个正方形类Square:

现在,如果要在绘图程序中使用这些类,必须定义每个实例在绘图表面的位置信息。在每个实例中定义x、y坐标,即可实现这一点:

class Square:

    def __init__(self, side=1, x=0, y=0):

        self.side = side

        self.x = x

        self.y = y

class Circle:

    def __init__(self, radius=1, x=0, y=0):

        self.radius = radius

        self.x = x

        self.y = y

这种方式能起作用,但如果要扩展大量的形状类,就会产生大量重复代码,因为可能要让每种形状类都具备这种位置的概念。毫无疑问,这正是在面向对象语言中使用继承的标准场景。不用在每个形状类中都定义变量x和y,而可以将各种形状抽象为一个通用的Shape类,并让定义具体形状的类继承自该通用类。在Python中,定义方式如下:

在Python中使用继承类通常有两个要求,在Circle类和Square类的粗体代码中可以看到这两个要求。第一个要求是定义继承的层次结构,在用class关键字定义类名之后的圆括号中,给出要继承的类即可。在上述代码中,Circle和Square都继承自Shape。第二个要求比较微妙一些,就是必须显式调用被继承类的__init__方法。Python不会自动执行初始化操作,但可以用super函数让Python找到被继承的类。初始化的工作在示例中由super().__ init__(x, y)这行代码来完成,这里将调用Shape的初始化函数,用适当的参数初始化实例。如果没有显式调用父类的初始化方法,则本例中的Circle和Square的实例就不会给实例变量x和y赋值。

可以不用super来调用Shape的__init__,而是用Shape.init(self, x, y)显式给出被继承类的名字,同样能够实现在实例初始化完毕后调用Shape的初始化函数。从长远来看,这种做法不够灵活,因为对被继承类名进行了硬编码。如果日后整体设计和继承架构发生了变化,这就可能成为问题。但在继承关系比较复杂的时候,采用super会比较麻烦。因为这两种方案无法完全混合使用,所以请把代码中采用的方案清楚地记录在文档中备查。如果方法未在子类或派生类中定义,但在父类中有定义,继承机制也会生效。为了查看这种继承的效果,请在Shape类中再定义一个move方法,表示移动到指定位置。该方法将会把实例的x和y坐标修改为参数指定的值。Shape的定义现在变成了:

class Shape:

    def __init__(self, x, y):

        self.x = x

        self.y = y

    def move(self, delta_x, delta_y):

        self.x = self.x + delta_x

        self.y = self.y + delta_y

如果这个Shape定义与之前的Circle、Square一起输入完毕,就可以进行以下的交互式会话:

>>> c = Circle(1)

>>> c.move(3, 4)

>>> c.x

3

>>> c.y

4

如果在交互式会话中执行上述代码,请务必在新定义的Shape类之后将Circle类的代码重新录入一遍。以上示例中的Circle类本身没有定义move方法,但由于继承自实现move的类,因此Circle的所有实例都可以使用move方法。用比较传统的OOP术语来描述,就是所有Python方法都是虚方法。也就是说如果方法在当前类中不存在,则会在父类中逐级搜索,并采用第一个找到的方法。

实例可以继承类的属性。实例变量是和对象实例关联的,某个名称的实例变量在一个实例中只会存在一个。看一下以下示例,这里会用到以下类的定义,

class P:

    z = "Hello"

    def set_p(self):

        self.x = "Class P"

    def print_p(self):

        print(self.x)

class C(P):

    def set_c(self):

        self.x = "Class C"

    def print_c(self):

        print(self.x)

执行以下代码:

>>> c = C()

>>> c.set_p()

>>> c.print_p()

Class P

>>> c.print_c()

Class P

>>> c.set_c()

>>> c.print_c()

Class C

>>> c.print_p()

Class C

上述示例中的对象c是类C的实例。C继承自P,但c并非继承自类P的某个不可见的实例,而是直接从P继承方法和类变量的。因为只存在一个实例c,在c的方法调用中,对实例变量x的任何引用都只能指向c.x。在c上无论调用哪个类定义的方法,均会如此。如上所示,由c调用的set_p和print_p,都是在类P里定义的,且都引用了同一个变量,在c上调用set_c和print_c时,引用的也是这个变量。通常这正是实例变量应有的表现,因为对同一个名称的实例变量的引用,就应该指向同一个变量。不过有时也会有不同需求,可通过私有变量来实现(参见15.9节)。类变量是支持继承的,但应该避免命名冲突,并小心类变量一节中提及的种种现象。在以下示例中,父类P中定义了类变量z,并且通过以下3种方式都能被访问到:实例c、派生类C或直接用父类P:

>>> c.z; C.z; P.z

'Hello'

'Hello'

'Hello'

但如果通过类C来对类变量z赋值,就会在类C中创建一个新的类变量。这对P的类变量本身(通过P访问)没有影响。但以后通过类C或其实例c看到的,将会是这个新的变量,而不是原来的变量:

>>> C.z = "Bonjour"

>>> c.z; C.z; P.z

'Bonjour'

'Bonjour'

'Hello'

如果通过实例c来对z赋值,同样也会创建一个新的实例变量,最终会得到3个不同的变量

>>> c.z = "Ciao"

>>> c.z; C.z; P.z

'Ciao'

'Bonjour'

'Hello'

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Redis原理】底层数据结构 五种数据类型

文章目录 动态字符串SDS(simple dynamic string )SDS结构定义SDS动态扩容 IntSetIntSet 结构定义IntSet的升级 DictDict结构定义Dict的扩容Dict的收缩Dict 的rehash ZipListZipListEntryencoding 编码字符串整数 ZipList的连锁更新问题 QuickListQuickList源码 SkipListRedisOb…

Orange 单体架构 - 快速启动

1 后端服务 1.1 基础设施 组件说明版本MySQLMySQL数据库服务5.7/8JavaJava17redis-stackRedis向量数据库最新版本Node安装Node22.11.0 1.2 orange-dependencies-parent 项目Maven依赖版本管理 1.2.1 项目克隆 GitHub git clone https://github.com/hengzq/orange-depende…

在线骑行|基于SpringBoot的在线骑行网站设计与实现(源码+数据库+文档)

在线骑行网站系统 目录 基于SpringBoot的在线骑行设计与实现 一、前言 二、系统设计 三、系统功能设计 5.1用户信息管理 5.2 路线攻略管理 5.3路线类型管理 5.4新闻赛事管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取…

内外网文件传输 安全、可控、便捷的跨网数据传输方案

一、背景与痛点 在内外网隔离的企业网络环境中,员工与外部协作伙伴(如钉钉用户)的文件传输面临以下挑战: 安全性风险:内外网直连可能导致病毒传播、数据泄露。 操作繁琐:传统方式需频繁切换网络环境&…

Unity学习笔记-Unity了解,安装,简单配置(一)

Unity 是什么? Unity 是一款广受欢迎的跨平台游戏开发引擎,由 Unity Technologies 公司开发并推出。它以强大的功能和易用性,在游戏开发领域占据着举足轻重的地位,甚至可以说,它改变了游戏开发的格局。凭借其出色的跨…

骁勇善战的量化利器:多因子模型【量化理论】

我叫补三补四,很高兴见到大家,欢迎一起学习交流和进步 今天来讲一讲alpha策略制定后的测试问题 风险模型雏形 股票因子受多种因素影响,其价格由多种因素决定,所谓的多因子策略就是要发掘诸如此类的因子,以一种合理的方…

【DeepSeek】本地部署,保姆级教程

deepseek网站链接传送门:DeepSeek 在这里主要介绍DeepSeek的两种部署方法,一种是调用API,一种是本地部署。 一、API调用 1.进入网址Cherry Studio - 全能的AI助手选择立即下载 2.安装时位置建议放在其他盘,不要放c盘 3.进入软件后…

国产编辑器EverEdit - 文本编辑器的关键特性:文件变更实时监视,多头编辑不掉坑

1 监视文件变更 1.1 应用场景 某些时候,用户会使用多个编辑器打开同一个文件,如果在A编辑器修改保存,但是B编辑器没有重新打开,直接在B编辑器修改再保存,则可能造成在A编辑器中修改的内容丢失,因此&#x…

【Linux】【网络】不同子网下的客户端和服务器通信

【Linux】【网络】不同子网下的客户端和服务器通信 前两天在进行socket()网络编程并进行测试时,发现在不同wifi下两个电脑无法进行连接,大概去查找了如何解决 看到可以使用 frp 这个快速反向代理实现。 frp 可让您将位于 NAT 或防火墙后面的本地服务器…

基于Python+django+mysql旅游数据爬虫采集可视化分析推荐系统

2024旅游推荐系统爬虫可视化(协同过滤算法) 基于Pythondjangomysql旅游数据爬虫采集可视化分析推荐系统 有文档说明 部署文档 视频讲解 ✅️基于用户的协同过滤推荐算法 卖价就是标价~ 项目技术栈 Python语言、Django框架、MySQL数据库、requests网络爬虫…

基于 go-wrk 在 Windows 环境下对 Go Web 应用进行 HTTP 压力测试

基于 go-wrk 在 Windows 环境下对 Go Web 应用进行 HTTP 压力测试 这部分内容参考并搬运自 q1mi 老师的技术博客,原文的链接为:https://liwenzhou.com/posts/Go/benchmark-tools/。 压测相关术语 响应时间(RT):指系…

CSS 媒体查询:从入门到精通,打造跨设备完美体验

在当今移动互联网时代,用户访问网站的设备早已不再局限于桌面电脑,手机、平板等各种屏幕尺寸的设备层出不穷。为了确保用户在不同设备上都能获得良好的浏览体验,响应式网页设计应运而生。而 CSS 媒体查询,正是实现响应式设计的核心…

如何在 macOS 上配置 MySQL 环境变量

如何在 macOS 上配置 MySQL 环境变量 步骤 1: 查找 MySQL 安装路径 打开终端,使用以下命令查找 mysql 的可执行文件路径: which mysql如果该命令没有返回结果,可以使用 find 命令: sudo find / -name "mysql" 2>/de…

Gin从入门到精通 (五)数据绑定与验证

数据绑定与验证 数据绑定是指将请求数据(如 JSON、表单、URL 参数等)绑定到 Go 语言中的结构体。Gin 提供了便捷的方法将请求中的数据映射到预定义的结构体字段上,使得开发者可以像访问结构体字段一样访问请求数据。 数据验证是对绑定到结构…

计算机毕业设计SpringBoot+Vue.jst网上超市系统(源码+LW文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

【论文解读】《Training Large Language Models to Reason in a Continuous Latent Space》

论文链接 1. 背景与动机 语言空间与推理的矛盾 目前大多数大语言模型(LLMs)在解决复杂问题时采用链式思维(Chain-of-Thought, CoT)方法,即利用自然语言逐步推导出答案。然而,论文指出: 自然语言…

DevEco Studio常用快捷键以及如何跟AndroidStudio的保持同步

DevEco Studio快捷键 DevEco Studio是华为推出的用于开发HarmonyOS应用的集成开发环境,它提供了丰富的快捷键以提高开发效率,以下为你详细介绍不同操作场景下的常用快捷键: 通用操作快捷键 操作描述Windows/Linux 快捷键Mac 快捷键打开设置窗…

4. MySQL 逻辑架构说明

4. MySQL 逻辑架构说明 文章目录 4. MySQL 逻辑架构说明1. 逻辑架构剖析1.1 服务器处理客户端请求1.2 Connectors(连接器)1.3 第1层:连接层1.4 第2层:服务层1.5 第3层:引擎层1.6 存储层 2. SQL执行流程2.1 MySQL 中的 SQL 执行流程 2.2 MySQL…

基于 Python Django 的校园互助平台(附源码,文档)

博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不…

【CVPR2024-工业异常检测】PromptAD:与只有正常样本的少样本异常检测的学习提示

代码链接 摘要 摘要写作总结: 1.提出 两个关键点 (视觉语言模型【模型】 少量工业异常检测【方向】) 2.想要解决的问题 3.针对上述问题,本文提出了一种什么【方法】的什么【应用方面】方法【模型名】 4.具体讲方法的步骤 5.实验…