对于在类体中定义的实例方法,Python 会自动绑定方法的第一个参数(通常建议将该参数命名为 self),第一个参数总是指向调用该方法的对象。根据第一个参数出现位置的不同,第一个参数所绑定的对象略有区别:

在构造方法中引用该构造方法正在初始化的对象。

在普通实例方法中引用调用该方法的对象。

由于实例方法(包括构造方法)的第一个 self 参数会自动绑定,因此程序在调用普通实例方法、构造方法时不需要为第一个参数传值。

self 参数(自动绑定的第一个参数)最大的作用就是引用当前方法的调用者,比如前面介绍的在构造方法中通过 self 为该对象增加实例变量。也可以在一个实例方法中访问该类的另一个实例方法或变量。假设定义了一个 Dog 类,这个 Dog 对象的 run() 方法需要调用它的 jump() 方法,此时就可通过 self 参数作为 jump() 方法的调用者。

方法的第一个参数所代表的对象是不确定的,但它的类型是确定的,即它所代表的只能是当前类的实例;只有当这个方法被调用时,它所代表的对象才被确定下来谁在调用这个方法,方法的第一个参数就代表谁。

例如定义如下 Dog 类:class Dog:

# 定义一个jump()方法

def jump(self):

print("正在执行jump方法")

# 定义一个run()方法,run()方法需要借助jump()方法

def run(self):

# 使用self参数引用调用run()方法的对象

self.jump()

print("正在执行run方法")

上面代码的 run() 方法中的 self 代表该方法的调用者:谁在调用 run() 方法,那么 self 就代表谁。因此该方法表示:当一个 Dog 对象调用 run() 方法时,run() 方法需要依赖它自己的 jump() 方法。

当 Python 对象的一个方法调用另一个方法时,不可以省略 self。也就是说,将上面的 run()方法改为如下形式是不正确的:# 定义一个run()方法,run()方法需要借助jump()方法

def run():

#省略self,下面代码会报错

self.jump()

print("正在执行run方法")

此外,在构造方法中,self 参数(第一个参数)代表该构造方法正在初始化的对象。例如如下代码:class InConstructor :

def __init__(self) :

# 在构造方法里定义一个foo变量(局部变量)

foo = 0

# 使用self代表该构造方法正在初始化的对象

# 下面的代码将会把该构造方法正在初始化的对象的foo实例变量设为6

self.foo = 6

# 所有使用InConstructor创建的对象的foo实例变量将被设为6

print(InConstructor().foo) # 输出6

在 InConstructor 的构造方法中,self 参数总是引用该构造方法正在初始化的对象。程序中将正在执行初始化的 InConstructor 对象的 foo 实例变量设为 6,这意味着该构造方法返回的所有对象的 foo 实例变量都等于 6。

需要说明的是,自动绑定的 self 参数并不依赖具体的调用方式,不管是以方法调用还是以函数调用的方式执行它,self 参数一样可以自动绑定。例如如下程序:class User:

def test(self):

print('self参数: ', self)

u = User()

# 以方法形式调用test()方法

u.test() # <__main__.User object at 0x00000000021F8240>

# 将User对象的test方法赋值给foo变量

foo = u.test

# 通过foo变量(函数形式)调用test()方法。

foo() # <__main__.User object at 0x00000000021F8240>

上面程序中第 5 行代码以方法形式调用 User 对象的 test() 方法,此时方法调用者当然会自动绑定到方法的第一个参数(self 参数);程序中第 11 行代码以函数形式调用 User 对象的 test() 方法,看上去此时没有调用者了,但程序依然会把实际调用者绑定到方法的第一个参数,因此输出结果完全相同。

当 self 参数作为对象的默认引用时,程序可以像访问普通变量一样来访问这个 self 参数,甚至可以把 self 参数当成实例方法的返回值。看下面程序:class ReturnSelf :

def grow(self):

if hasattr(self, 'age'):

self.age += 1

else:

self.age = 1

# return self返回调用该方法的对象

return self

rs = ReturnSelf()

# 可以连续调用同一个方法

rs.grow().grow().grow()

print("rs的age属性值是:", rs.age)

从上面程序中可以看出,如果在某个方法中把 self 参数作为返回值,则可以多次连续调用同一个方法,从而使得代码更加简洁。但是这种把 self 参数作为返回值的方法可能会造成实际意义的模糊,例如上面的 grow 方法用于表示对象的生长,即 age 属性的值加 1,实际上不应该有返回值。

python 函数参数self_python self用法详解相关推荐

  1. Python函数参数之*与**用法详解

    首先,我们来看一个函数定义: def f(a,*b,**c):print(f'a:{a},b:{b},c:{c}') *b与**c都是可变参数 出现带一个星号的参数 b,这是可变位置参数 带两个星号的 ...

  2. python字符串strip的作用_Python字符串函数strip()原理及用法详解

    Python字符串函数strip()原理及用法详解 strip:用于移除字符串头尾指定的字符(默认为空格)或字符序列.注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符. 语法:str.s ...

  3. python控制画笔尺寸,Python画笔的属性及用法详解

    画笔有颜色.画线的宽度等属性. 1.turtle.pensize():设置画笔的宽度: 2.turtle.pencolor():没有参数传入返回当前画笔颜色:传入参数设置画笔颜色,可以是字符串如&qu ...

  4. python读取json格式文件大量数据,以及python字典和列表嵌套用法详解

    1.Python读取JSON报错:JSONDecodeError:Extra data:line 2 column 1 错误原因: JSON数据中数据存在多行,在读取数据时,不能够单单用open(), ...

  5. Python for i in range ()用法详解

    for i in range ()作用: range()是一个函数, for i in range () 就是给i赋值: 比如 for i in range (1,3): 就是把1,2依次赋值给i r ...

  6. Python中数组切片的用法详解

    Python中数组切片的用法详解 一.python中"::-1"代表什么? 二.python中":"的用法 三.python中数组切片 三.numpy中的整数数 ...

  7. 站长在线Python精讲:在Python函数中参数传递的位置参数详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中参数传递的位置参数详解>.本文的主要内容有:实参和形参数量必须与定义时一致和实参和形参位置必须与定义时一 ...

  8. python 函数参数self_Python类中self参数用法详解

    Python编写类的时候,每个函数参数第一个参数都是self,一开始我不管它到底是干嘛的,只知道必须要写上.后来对Python渐渐熟悉了一点,再回头看self的概念,似乎有点弄明白了. 首先明确的是s ...

  9. matlab中采样函数,matlab采样相关函数用法详解

    matlab采样函数(降采样,过采样,减采样函数)用法详解 dyaddown 功能:对时间序列进行二元采样,每隔一个元素提取一个元素,得到一个降采样时间序列. 格式: 1.y = dyaddown(x ...

最新文章

  1. 使用扩展的 CodeIgniter 框架实现 RESTful 框架
  2. 管理文库]我喜欢的10个经典管理学定律点评
  3. error while loading shared libraries: libmysql....
  4. opencv:读取、保存操作函数
  5. 初学ArcGIS API for JavaScript
  6. Bootstrap导航栏
  7. DNS A记录和CNAME记录
  8. 华为鸿蒙安全认证,手机系统哪家强,华为鸿蒙系统获得国际安全标准最高等级认证,强不强?...
  9. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第6节 Lambda表达式_5_Lambda表达式的无参数无返回值的...
  10. 【TWVRP】基于matlab遗传算法求解送货且带时间窗的车辆路径规划问题【含Matlab源码 1074期】
  11. 1、《java就业培训教程》-张孝祥
  12. svn服务端可视化界面
  13. 基于昊芯DSC28034+四针OLED屏(保姆级教程)
  14. 苹果手机如何分享wifi密码_WiFi密码破解器 v5.1.3手机版
  15. 截至20161210创业板股票代码和名称
  16. 【Java成王之路】EE进阶第十篇 MyBatis查询数据库
  17. SiamRPN 论文理解
  18. 伦敦银现的交易时间特点
  19. IB成绩该如何换算GPA?
  20. 电子邮件成为当下网络攻击的主要传播途径

热门文章

  1. 《大话计算机》勘误汇总截至2019-07-26
  2. js 获取 上传视频时长
  3. SAP部分清账和剩余清账
  4. 如何安装pkg-config
  5. 【听讲座】小米联合创始人黄江吉:人工智能的硬件发展
  6. 未来十年,最赚钱的17大行业全在这
  7. 每日刷题Day_15-17
  8. 又来一个神器!Python脚本打包 exe,auto-py-to-exe来帮你!
  9. 智能二狗机器人使用攻略,微信群活跃助手
  10. 深度共建产业学院项目合作协议-某真实案例