在python中定义类时实例方法的第一个参数_第7.14节 Python类中的实例方法详析

第7.14节 Python类中的实例方法详析

一、    实例方法的定义

在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式:

1.    类体中定义实例方法

第一种方式很简单,就是在类体中定义,所有在类中定义的方法默认是实例方法。定义实例方法与定义函数基本相同,只是Python要求实例方法的第一个形参必须为self,也就是实例对象本身,因此实例方法至少应该有一个self参数。关于self的说明,请大家参考老猿前面的章节《》。如下例子:

class MethodTest():

def method1(self):print("in method1")

2.    在类体外将一个函数直接赋值给一个对象实例

Python 是动态语言,允许为对象动态增加方法,相关步骤如下:

1)    按照实例方法定义形式在类体外定义一个函数,函数需要将self作为第一个参数;

2)    使用“实例对象名.方法名=函数”方式在实例中增加方法。

老猿认为,这种动态定义实例方法,本质上就是动态增加实例变量,只是这个实例变量比较特殊,是个函数类型,对应的赋值也是一个函数。因此上述方法定义的实例方法,与类体中定义的方法还是有差别的,对这种方法Python 不会将实例对象自动绑定到方法的第一个参数,即使将第一个参数命名为 self 也没有用。

3.    在类体外将一个函数绑定到对象实例

这种方法与第二种方法本质上是一致的,只是能解决调用时无法自动将实例对象作为第一个实参处理的问题。具体绑定方法如下:

1)    按照实例方法定义形式在类体外定义一个函数,函数需要将self作为第一个参数;

2)    使用“实例对象名.方法名 = MethodType(函数, 对象)” 方式在实例中增加方法。

其中MethodType是从Python的types模块import进来的,通过MethodType可以将函数与实例对象的某个方法进行绑定,调用时就无需再传递实例对象到第一个参数。

上述第二种和第三种方法都是动态方法,绑定的“实例对象名.方法名”可以是一个已经存在的实例方法,也可以是新定义的一个属性方法,如果是一个已经存在的实例方法,新绑定的函数将替换原实例的方法。

二、    实例方法的使用

1.    实例方法可以在类体的实例方法内调用,此时调用方使用“self.方法”方式调用,并在调用传递实参时不需要使用self。请看如下类的定义和调用:

class MethodTest():

def method1(self):print("in method1")

def method2(self):

print("in method2")

self.method1()

上述代码中method2调用了方法method1,使用self方式调用。

2.    在类体外面调用类体内直接定义的实例方法,直接用“实例名.方法名”方式调用,对于类体内定义的实例方法传实参时无需传递self形参对应的实参,由Python在编译时自动添加实例对象作为第一个实参。请看上面的类定义实例对象后调用method2:

m1=MethodTest()

m1.method2()

上述样例代码执行截图:

注意:在类外调用实例方法时,无需也不能传递self的实参,由Python解释器自动为其在后面执行时添加。如果定义的方法没有以类方法的方式定义,也没有在方法定义时将self作为第一个形参,编译时并不会报错,但调用该实例方法时会有运行时错误,因为Python会强行绑定实例对象作为第一个参数,因此调用者的实参与定义的形参是一样时,此时会多出一个实参self,导致执行时报参数个数不对的错误。

3.    在类体外面调用通过函数直接赋值定义的实例方法时,其调用方式与类体内定义的模式不同,要求第一个实参必须是调用的对象本身;

以上面的类MethodTest为例,如果要增加一个method3的实例方法,其代码如下:

def dynamicmethond(self):print("in DynamicMethond")

m1.method3=dynamicmethond

这样m1这个实例就增加了一个method3方法,调用代码如下:

m1.method3(m1)  #注意必须在第一个参数将实例自身传递进去

4.    在类体外面调用通过MethodType绑定的实例方法时,其调用方式与类体内定义的模式相同,第一个形参self对应的实参无需传值,由Python自动添加对应的实例对象;

以上面的类MethodTest为例,如果要增加一个method4的实例方法进行绑定,其代码如下:

def dynamicmethond(self):print("in DynamicMethond")

m1.method4= MethodType(dynamicmethond,m1)

这样m1这个实例就增加了一个method4方法,且实现了方法与实例的绑定,调用代码如下:

m1.method4()

三、    构造方法

之所以单独介绍构造方法,是因为构造方法是一个特殊的实例方法,具体特殊性包括如下:

1.    Python的构造方法对所有自定义类名字都固定为__init__,且第一个参数必须为self;

2.    可以允许开发者没有在类中定义构造方法,此时Python 会自动为该类定义一个只包含一个 self 参数的默认的构造方法;

3.    构造方法如果有多个形参,除了第一个参数必须是self外,其他参数都是创建实例时在类名后面的括号中给出,也就构造方法的参数就是创建实例时传入的参数,也必须是创建实例时传入;

4.    构造方法是每个实例定义时自动执行;

5.    在子类重写构造方法时,必须调用超类(继承的类)的构造方法,否则可能无法正确地初始化对象。

1)    Python3中所有类都继承于object类,构造函数的重写不用考虑object类的情况,即无需调用object类的构造函数;

2)    在构造方法中调用父类的构造方法时,可以使用“父类.类名.__init__(self,其他参数)”的方式调用;

3)    在构造方法中调用父类的构造方法时,可以使用“super().__init__ (参数)”的方式调用,注意此时的参数中不能传递self参数。但这种情况如果存在多个超类时,执行的是第一个超类的构造方法,其实参必须按照第一个超类构造方法的形参来传递,其他超类的构造方法必须通过“父类.类名.__init__(self,其他参数)”的方式调用。

理解了这几点,结合其他语言的构造方法,就理解了Python的构造方法。

四、    本节相关代码的完整执行截屏

本节结合案例详细介绍了实例方法的定义和使用方法,需要注意,动态定义实例方法只影响单个实例自身,对其他实例没有影响。老猿认为动态定义实例方法的使用范围比较有限,如果可能尽量使用类体定义实例方法,仅在特定场景(如动态扩展功能)下使用动态实例方法。

老猿Python(https://blog.youkuaiyun.com/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。

欢迎大家批评指正,谢谢大家关注!

Python 类中self 实例方法 在介绍Python的self用法之前,先来介绍下Python中的类和实例…… 我们知道,面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,比如学生这个抽象的事物,可以用一个Student类来表示。而实例是根据类创建出来的一个个具体的“对象”,每一个对象都从类中继承有相同的方法,但各自的数据可能不同。 1、以Student类为例,在Python中,定义类如下: cl... 阅读详情

相关推荐

DRM驱动代码分析:展频 跳频

DRM驱动代码分析:展频 跳频

yuuu_cheer的博客 2680

python类

1、类包含属性和方法 类是属性和方法的组合,所以语句1可能是内部变量(数据、属性)的定义和赋值语句,也可能是内部方法(函数)的定义语句 ⑴一个对象的特征称为"属性" ⑵一个对象的行为称为"方法" ⑶属性在代码层面上来看就是变量,方法实际就是函数,通过调用这些函数来完成某些工作 2.类对象支持两种操作:属性引用和实例化 在未实例化类时(my_class = MyClass()前),只是定义了类对象的属性和方法,此时其还不是一个完整的对象,将定义的这些称为类(抽...

tiger00O的博客 1538

Uni-App推送踩坑实录:从云函数URL化到后台推送失效,我都经历了什么

本文详细记录了Uni-App开发者在接入uni-push 2.0时遇到的推送失效问题,从云函数URL化到后台推送失效的完整排查过程。通过系统化分析和与官方沟通,最终找到解决方案,并分享了预防措施与最佳实践,帮助开发者避免类似问题。

weixin_42552716的博客 487

Python基础之面向对象编程

python面向对象编程 具有封装、继承、多态的特性; 继承:子类定义了自己的--init--方法的时候,务必要先显示调用父类的--init--方法,否则父类会初始化失败 面向过程就是一件事的先后顺序来的 面向对象:将一件事情想象为一个对象,然后提取对该对象的所有的共同的方法和属性,利用方法和属性完成这件事情的假想; 类:具有相同属性和方法的总称 对象:类的实例叫做对象 self的作用:主要是在定义实例函数表明当前是一个实例方法,只能由类的实例来调用 self在定义方法时必须以第一个参数的形

qq_58877067的博客 1183

海思MPP平台千兆以太网驱动集成与测试指南

千兆以太网(GE)是嵌入式视觉系统中音视频流传输与边缘控制的核心物理接口,其底层驱动需兼顾DMA高效调度、中断实时响应与PHY链路稳定性。在Linux嵌入式环境中,GE驱动通常基于net_device框架实现,并深度耦合于SoC专用媒体处理平台(如海思MPP),通过硬件抽象层(HAL)屏蔽寄存器操作,提供零拷贝、RGMII时序适配、描述符环管理等关键能力。技术价值体现在降低CPU负载、保障1080p@30fps实时推流、支持ONVIF/RTSP协议交互及固件远程升级。典型应用场景包括网络摄像机(IPC)、A

weixin_42599908的博客 89

数据结构与算法 —— 最短路径Dijkstra算法(迪杰斯特拉)详细图解以及python实现

前两章我们讲到了关于图的基本知识,和广度/深度优先搜索。本章,我们将介绍加权图和最短路径的相关知识。最短路径和最小生成树是图论中常见的问题。最短路径是指在一个图中找到两个节点之间的最短路径,最小生成树是指在一个图中找到一个连通子图,使得所有节点都能够互相到达,且总权值最小。最短路径算法常见的有floyd算法(弗洛伊德算法)和 dijkstra算法(迪杰斯特拉)。本文只介绍dijkstra算法。最短路径运用非常广泛,比如在导航系统中,确定两个地点间哪条路线最短;

‘’ 2万+

python cls方法_关于类方法中的cls

在python的类方法中,默认使用的第一个参数是cls,而在实例方法中,一般使用self作为第一个参数。两处比较:(1)比较一般类方法中的self和cls的区别:一般来说,使用某个类的方法,需要先将类实例化,赋予一个对象才可以调用类中的方法,但是如果使用了@staticmethod 或@classmethod,就可以不用实例化,直接类名.方法名()来调用。这有利于组织代码,把某些应该属于某个类的函...

weixin_36153937的博客 1万+

Multisim仿真运放积分器踩坑实录:为什么你的方波变不成三角波?

本文针对Multisim仿真运放积分器时方波无法转换为三角波的常见问题,提供了详细的排查与调试指南。文章指出,经典RC积分电路因直流反馈开路导致运放饱和,核心解决方案是在反馈电容两端并联大阻值电阻以稳定直流工作点。通过参数优化(调整Rin、C、Rf)和高级仿真技巧,手把手教你调出线性度好、幅度适中的完美三角波,并分享异常波形(如饱和、不对称、振荡)的对应策略。

weixin_29231263的博客 114

python类的构造函数self_第7.5节 揭开Python类中self的面纱

在上节已经引入介绍了类定义,并简单介绍了类变量、实例变量、类方法和实例方法,后面章节还会进一步详细介绍相关的内容。本节要介绍的self是与类变量、实例变量、类方法和实例方法具体定义实现强相关的。一、什么是self?在Python中self实际上是指向类声明的实例对象自身,如果要在实例方法中访问实例变量,必须在变量前加“self.”。显然,self很有用,甚至必不可少。如果没有它,所有的方法都无法访...

weixin_39908082的博客 739

POWER SI仿真流程

一、打开软件Power SI二、加载PCB,可以直接使用brd文件,不用再进行格式转换三、check Stackup,与原来的PCB叠层对照一遍,检查数据加载后有没有出错。四、select Nets,加载brd文件后,可能所有的网络都处于使用状态,先在右侧net manager下面右键disable all nets,再使能需要仿真的电源网络(如果要仿真的网络没有归属到电源网络,在其上右键,选classfy as power \ground nets)

lx5213的博客 1321

从零构建:用Simulink搭建固定翼无人机六自由度模型的避坑指南

本文详细介绍了使用Simulink从零构建固定翼无人机六自由度动力学模型的完整流程和避坑指南。重点解析了模型架构设计、气动力计算、参数配置、仿真求解器选择等关键环节的常见问题与解决方案,帮助开发者快速建立准确可靠的无人机控制系统仿真模型。

hhh00的博客 999

类方法和实例方法

 OC中的方法:     对象方法/实例方法,如果想要调用对象就必须要创建对象,通过对象名来调用     类方法:类方法的调用,不依赖对象,如果调用类方法,不需要去创建对象,而是直接通过类名来直接调用。、    对象方法声明:主要是使用一个-(void)sayHi    类方法的声明:类方法的声明是用 +      +(返回值类型)方法名  除了-+其他都一样,声明再.h 实现.m...

It's better to burn out 'cause rust never sleeps(与其苟延残喘,不如钟情燃烧) 602

Android功耗系列专题分析之四:待机概率性功耗高的失效分析

本文分析了Android设备待机功耗异常高的问题。通过日志发现系统休眠失败,原因是PowerManagerService.Display唤醒锁未被释放。进一步排查发现,指纹解锁功能在灭屏时未正确释放屏幕锁定,导致DisplayReady状态异常。解决方案是将指纹功能的背光控制与DisplayReady状态控制分离,使用两个变量独立管理。经验表明,快速定位问题比解决问题更重要,修改原生流程时需谨慎评估风险。

451

第7.14节 Python类中的实例方法详析

第7.14节 Python类中的实例方法详析 一、 实例方法的定义 在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式: 1. 类体中定义实例方法 第一种方式很简单,就是在类体中定义,所有在类中定义的方法默认是实例方法。定义实例方法与定义函数基本相同,只是Python要求实例方法的第一个形参必须为self,也就是实例对象本身,因此实例方法至少应该有一个self参数。关于s...

老猿Python 5662

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

python类的实例方法必须创建对象前还是后可以调用_第7.14节 Python类中的实例方法详析...

第7.14节 Python类中的实例方法详析一、 实例方法的定义在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式:1. 类体中定义实例方法第一种方式很简单,就是在类体中定义,所有在类中定义的方法默认是实例方法。定义实例方法与定义函数基本相同,只是Python要求实例方法的第一个形参必须为self,也就是实例对象本身,因此实例方法至少应该有一个self参数。关于self的说...

weixin_39603622的博客 6172

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

在python中定义类时实例方法的第一个参数名称_第7.5节 揭开Python类中self的面纱...

在上节已经引入介绍了类定义,并简单介绍了类变量、实例变量、类方法和实例方法,后面章节还会进一步详细介绍相关的内容。本节要介绍的self是与类变量、实例变量、类方法和实例方法具体定义实现强相关的。一、什么是self?在Python中self实际上是指向类声明的实例对象自身,如果要在实例方法中访问实例变量,必须在变量前加“self.”。显然,self很有用,甚至必不可少。如果没有它,所有的方法都无法访...

weixin_39845206的博客 6587

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Python 类的构造方法、析构方法、实例方法

1. 实例方法1.1 定义实例方法是用于访问对象实例属性的方法,语法如下:登录后复制 class 类: def 实例方法(self): self.属性1.2.3.实例方法定义在类中,它的第一个参数 self 指向调用该方法的对象,在实例方法中通过 “self.属性” 访问对象的实例属性。1.2 例...

小屁孩大帅-保密的博客 836

python十四类实用技巧_第7.14节 Python类中的实例方法详析

第7.14节 Python类中的实例方法详析一、 实例方法的定义在本章前面章节已经介绍了类的实例方法,实例方法的定义有三种方式:1. 类体中定义实例方法第一种方式很简单,就是在类体中定义,所有在类中定义的方法默认是实例方法。定义实例方法与定义函数基本相同,只是Python要求实例方法的第一个形参必须为self,也就是实例对象本身,因此实例方法至少应该有一个self参数。关于self的说...

weixin_36357157的博客 243

Python面向对象:实例方法的定义与self参数

深入理解实例方法的定义与self参数的核心概念与实践方法,掌握关键技术要点,了解实际应用场景与最佳实践。本文属于《Python从入门到精通教程》Python面向对象篇(第七篇)。

未来 95% 的 AI 应用将变得隐形,广泛融入日常生活。 9105

第8.18节 Python类中内置析构方法__del__

一、 引言 基本上所有支持OOP设计的语言都支持析构方法(也称析构函数),析构方法都是在对象生命周期结束时调用,一般用来实施实例相关生命周期内访问数据的扫尾工作,包括关闭文件、释放内存、输出日志、清理数据等。 二、 析构方法语法 Python中所有类的析构方法都是特殊方法__del__,析构方法同样是一个实例方法,其语法如下: del(self) self就是对象自身,所有实例方法都有该参数,真正...

老猿Python 5257

PYTHON 类定义,属性,初始化

文章目录PYTHON 类定义,属性,初始化类定义类的私有属性类方法类的初始化和析构初始化析构 PYTHON 类定义,属性,初始化 为了代码的编写方便简洁,引入了类的定义; 一般,使用 class 语句来创建一个新类,class之后为类的名称(通常首字母大写)并以冒号结尾,例如: 类中可以定义所使用的方法,类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名...

Limit_Fly的博客 8392

第7.10节 Python类中的实例变量定义与使用

一、 引言 在前面章节已经引入介绍了类变量和实例变量,类体中定义的变量为类变量,默认属于类本身,实例变量是实例方法中定义的self对象的变量,对于每个实例都是独有数据,而类变量是该类所有实例共享的属性和方法。 二、 实例变量的定义方式 1. Python变量的本质是被赋值,实例变量是在实例方法内第一次通过self方式赋值来定义,该实例方法不一定是构造方法,只要是实例方法中通过s...

老猿Python 2624

Python的类定义,实例化

定义: 必须使用class关键字 类名必须是用大驼峰命名 类定义完成后,就会产生一个类对象,绑定到了标识符ClassName上 class ClassName: 语句块 举例: class MyClass: """A example class""" x = 'abc'#类属性 def foo(self):#类属性foo,也是方法 return 'My Class' print(M...

weixin_44304481的博客 7244
上一篇: python meshgrid_python – 为极坐标创建一个meshgrid
下一篇: python多态方法_Python类和方法_多态
weixin_39550937
博客等级 码龄9年 40粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值