72 成员方法、类方法、静态方法、抽象方法

news2024/9/28 9:24:07

在面向对象程序设计中,函数和方法这两个概念是有本质区别的。方法一般指与特定实例绑定的函数,通过对象调用方法时,对象本身将被作为第一个参数自动传递过去,普通函数并不具备这个特点。

class Demo:
    pass


t = Demo()


def test(self, v):
    self.value = v


t.test = test  # 动态增加普通函数
print(t.test)
t.test(t, 3)  # 需要为 self 传递参数
print(t.value)

import types

t.test = types.MethodType(test, t)  # 动态增加绑定的方法
print(t.test)
t.test(5)  # 不需要为 self 传递参数
print(t.value)

在这里插入图片描述

Python 类的成员方法大致可以分为公有方法、私有方法、静态方法、类方法和抽象方法这几种类型。

① 公有方法、私有方法和抽象方法一般是指属于对象的实例方法,私有方法的的名字以两个或更多个下画线开始,而抽象方法一般定义在抽象类中并且要求派生类必须重新实现。

每个对象都有自己的公有方法和私有方法,在这两类方法中都可以访问属于类和对象的成员。公有方法通过对象名直接调用,私有方法不能通过对象名调用,只能在其他实例方法中通过前缀 self 进行调用或在外部通过特殊的形式来调用。另外,Python 中的类还支持大量的特殊方法,这些方法的两侧各有两个下画线,往往与某个运算符或内置函数相对应。

所有实例方法(包括公有方法、私有方法、抽象方法和某些特殊方法)都必须至少有一个名为 self 的参数,并且必须是方法的第一个形参(如果有多个形参), self 参数代表当前对象。 在实例方法中访问实例成员时需要以 self 为前缀,但在外部通过对象名调用对象方法时并不需要传递这个参数。如果在外部通过类名调用属于对象的公有方法,需要显示为该方法的 self 参数传递一个对象名,用来明确指定访问哪个对象的成员。

静态方法和类方法都可以通过类名和对象名调用,但不能直接访问属于对象的成员,只能访问属于类的成员。 静态方法和类方法不属于任何实例,不会绑定到任何实例,当然也不依赖于任何实例的状态,与实例方法相比能够减少很多开销。类方法一般以 cls 作为第一个参数表示该类自身,在调用类方法时不需要为该参数传递值,静态方法则可以接收任何参数。

class Root:
    __total = 0

    def __init__(self, v):  # 构造方法,特殊方法
        self.__value = v
        Root.__total += 1

    def show(self):  # 普通实例方法,一般以 self 作为第一个参数的名字
        print('self.__value: ', self.__value)
        print('Root.__total: ', Root.__total)

    @classmethod  # 修饰器,声明类方法
    def classShowTotal(cls):  # 类方法,一般以 cls 作为第一个参数的名字
        print('cls.__total: ', cls.__total)

    @staticmethod  # 修饰器,声明静态方法
    def staticShowTotal():  # 静态方法,可以没有参数
        print('staticmethod, Root.__total: ', Root.__total)


x = Root(3)
x.classShowTotal()  # 通过对象来调用类方法
x.staticShowTotal()  # 通过对象来调用静态方法

y = Root(5)
Root.classShowTotal()  # 通过类名调用类方法
Root.staticShowTotal()  # 通过类名调用静态方法
# Root.show()  # 试图通过类名直接调用实例方法,失败
Root.show(x)  # 可以通过这种方法来调用方法并访问实例成员

在这里插入图片描述

在这里插入图片描述

抽象方法一般在抽象类中定义,并且要求在派生类中必须重新实现,否则不允许派生类创建实例。

import abc


class Foo(metaclass=abc.ABCMeta):  # 抽象类
    def func1(self):  # 普通实例方法
        print(123)

    def func2(self):  # 普通实例方法
        print(456)

    @abc.abstractmethod  # 抽象方法
    def func3(self):
        raise Exception('must reimplement this method')


class Bar(Foo):
    def func3(self):
        print('hello world')


bar = Bar()
bar.func3()

在这里插入图片描述

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

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

相关文章

html+css网页设计公司网站模版3个页面 无js 静态页面

htmlcss网页设计公司网站模版3个页面 无js 静态页面 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源…

推送给女朋友让她自己学习打光去(Stable Diffusion进阶篇:Imposing Consistent Light)

大家好我是极客菌!!! 对于学过stable diffusion的小伙伴来说,forge UI和Comfy UI会更加熟悉一些。在IC-Light发布后,Openpose editor的开发者将其制作成了一个Forge UI上的插件。 **https://github.com/huchenlei/sd-…

国内有哪些可以交易上证50etf期权的平台?

随着期权交易的普及,越来越多的投资者开始关注期权交易app平台。期权开通方式有券商和期权分仓平台两种,目前期权交易费用是7元左右一张,期权佣金是可以根据券商的证券范围进行调整的,下文为大家科普国内有哪些可以交易上证50etf期…

接口入门(企业常见使用,一分钟搞定版)

目录 1、接口的定义 定义位置 接口内容 2、接口的使用 正常实现接口 接口当做函数参数 匿名实现接口 3、OPPO便签接口具体分析 总结一下: 1、接口的定义 定义位置 可以写在类中,但注意现在接口名字是 类名.接口名 可以单独写在一个文件 接口内…

Linux系统使用Docker安装RStudio服务并实现任意浏览器远程访问

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE,并通过 Web 浏览器进行访问…

OpenCV图像滤波(8)getGaborKernel()函数的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数返回 Gabor 滤波器系数。 Gabor 滤波器在图像处理中非常有用,特别是在纹理分析、特征提取和边缘检测等领域。 函数原型 Mat c…

借助树状数组的思想实现cuda版前缀和

昨天面试快手,面试官出了一个cuda编程题–实现前缀和。当时没有做出来,一直在思考是否有类似于规约树这样的解法,感觉好难……面试结束后搜了一下cuda前缀和的介绍,发现该问题是一个经典的cuda编程问题,NVIDIA很早之前…

论文解读,神经网络全梯度表示《Full-Gradient Representation for Neural Network Visualization》

导语 这篇论文介绍了一种新的工具,称为全梯度,用于解释神经网络的响应。这个全梯度的概念将神经网络的响应分解为两个部分:输入灵敏度和每个神经元的灵敏度分量。 输入灵敏度:输入灵敏度指的是对于神经网络输出的影响程度。它反…

node中使用http创建web服务器

1.案例代码 // 1.导入http模块 const http require(http)// 2.创建web服务器实例 const server http.createServer()// 3.为服务器实例绑定request事件,监听客户的请求 server.on(request,function(req,res){console.log(欢迎来到服务器);// req.url是客户端请求…

【Material-UI】Checkbox组件:标签使用详解

文章目录 一、Checkbox 组件与标签概述1. 组件介绍2. 基本用法 二、Checkbox 标签的关键特性1. 标签与复选框的结合2. 必填项3. 禁用状态4. 带有图标的复选框5. 多行标签 三、Checkbox 标签的实际应用场景1. 表单选择项2. 设置选项3. 同意条款 四、注意事项1. 无障碍支持2. 样式…

windows环境编译ffmpeg +visual studio 2022

最近在配置ffmpeg环境,记录一下坑点。 系统环境 visual stdio 2022 安装c桌面开发人员版 大概8g 实际下载2g左右,配置齐全其余不选。 然后环境配置,这里我使用别人的图,路劲都差不多。找到VS即可 PATH配置: 编译 …

Spring 三级缓存解决循环依赖源码分析

什么是循环依赖? ServiceA依赖ServiceB,ServiceB依赖ServiceA。 启动Spring项目时,如果想实例化ServiceA,创建完ServiceA对象后,需要依赖注入ServiceB的对象,而ServiceB实例化时,需要ServiceA&…

大模型场景应用全集:持续更新中

一、应用场景 1.办公场景 智能办公:文案生成(协助构建大纲优化表达内容生成)、PPT美化(自动排版演讲备注生成PPT)、数据分析(生成公式数据处理表格生成)。 智能会议:会议策划&…

C++之 bind 绑定器深入学习:从入门到精通!

简介 本文详细阐述了 C 中关于 bind 绑定器技术的基本概念和常用技巧。 引入动机 在标准算法库中&#xff0c;有一个算法叫 remove_if&#xff0c;其基本使用如下&#xff1a; #include <iostream> #include <string> #include <algorithm> #include &l…

FANUC发那科模块 A03B-0823-C003 I/0 EXT

IO模块接线 在FANUC系统中IO模块的种类比较多&#xff0c;每种IO模块的使用场合也不相同&#xff0c;每种IO模块的接线脚位也有很大区别&#xff0c;对于电气设计人员来说&#xff0c;清楚知道常用IO模块的接线脚位&#xff0c;才能更好的规划地址、设计图纸&#xff0c;对于设…

MySQL多表

表关系 1.一对多 应用场景 班级和学生 部门和员工 建表原则 设置&#xff08;ForeginKey&#xff09;外键连接 一个表的外键即为另外一张表的主键,以此简历两张表的关系 因此需要再学生表中新增一列&#xff0c;命名为 班级表_id&#xff0c;即班级表的主键&#xff0c;又叫…

【力扣】572.另一棵树的子树

题目描述 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看…

电脑屏幕录制工具分享5款,附上详细电脑录屏教程(2024全新)

日月更迭&#xff0c;转眼间已经来到了2024年的立秋&#xff0c;在这个数字技术快速发展的时代&#xff0c;电脑录屏技术已经成为了一项不可或缺的技能&#xff0c;无论是用于工作汇报、在线教学、游戏直播还是个人娱乐。那么录屏软件哪个好用呢&#xff1f;接下来&#xff0c;…

QT按钮组

目录 按钮组 Push Button&#xff08;按钮&#xff09; Tool Button&#xff08;图片文字&#xff09; Radio Button(单选&#xff09; Check Button(多选) Command Link Button Dialog Button Box(对话按钮&#xff09; 按钮组 Push Button&#xff08;按钮&#xff09…

手机游戏录屏软件哪个好,3款软件搞定游戏录屏

在智能手机普及的今天&#xff0c;越来越多的人喜欢在手机上玩游戏&#xff0c;并希望能够录制游戏过程或者分享游戏技巧。然而&#xff0c;面对市面上众多的手机游戏录屏软件&#xff0c;很多人可能会陷入选择困难。究竟手机游戏录屏软件哪个好&#xff1f;在这篇文章中&#…