Python 进阶_OOP 面向对象编程_self 的实例绑定
目录
self 和绑定
在 Python 中 self 变量是特殊的, 其用于在实例方法中引用该方法所绑定的实例, 换句话说就是 Python 在实例化对象时会自动的将实例对象传递到类体的 self 变量中, 类体中的 self 变量代表了该类的实例对象. 实例方法无论在任何地方被调用, 实例对象总是作为第一个参数被传递进去, 从而实现了实例对象和实例方法的绑定, 这也是为什么同一个类可以实例化多个不同的实例化对象的原因之一.
所以, 当我们定义类实例方法, 在方法声明语句的参数列表中必须设置名为 self 的形参. 这也是类实例方法和常规方法最大的区别之一.
EXAMPLE:
In [5]: class AClass(object):
...: def __init__(self, name):
...: self.name = name
...: def show_name(self):
...: print self.name
...:
In [6]: a_object = AClass('jmilkfan')
In [7]: a_object.show_name()
jmilkfan
调用非绑定的方法
那我们是不是不通过实例对象就一定没办法调用类实例方法了呢?
答案是否定的!
调用类实例方法的本质就是要传递一个实例对象到该方法中作为第一个实参. 我们在定义类实例方法的时候将 self 变量作为方法的第一个形参, 这样做为我们带来的好处在于, 我们通过实例对象去调用该类实例方法时, 不需要显式的传递实例对象自身给 self 形参, 这一切都交由 Python 解析器去做. 相反, 如果我们希望不需要通过实例对象就能调用类实例方法, 那么我们就显式的将实例对象传入吧.
调用非绑定方法最常间的场景就是, 我们在派生一个子类, 并且希望在子类中覆盖父类的同名方法(重载).
EXSMPLE:
In [1]: class AClass(object):
...: def __init__(self, name):
...: self.name = name
...:
In [3]: class BClass(AClass):
...: def __init__(self, age):
...: AClass.__init__(self, name)
...: self.age = age
...:
在这个例子中, 我们在子类的构造器中调用了父类的构造器, 并且显式的传递了父类构造器所需要的 self 实参 __init__(self, name) 中, 所以我们可以通过类名结合句点标识符的方式来调用父类的实例方法 AClass.__init__(self, name) .
当然, 我们之前的博文中也介绍过这种时候我们建议通过 super()内置方法来实现.
Python 进阶_OOP 面向对象编程_self 的实例绑定的更多相关文章
- Python 进阶_OOP 面向对象编程_组合与继承
#目录 前言 组合 派生 通过继承来覆盖重载方法 最常用的重载场景实例方法的重载 从标准类中派生类方法的重载 前言 我们定义一个类是希望能够把类当成模块来使用,并把类嵌入到我们的应用代码中,与其他的数 ...
- Python 进阶_OOP 面向对象编程_实例属性和方法
目录 目录 构造器和解构器 构造器 __init__ 真构造器 __new__ 解构器 __del__ 实例方法 Python 中的 抽象方法 实例属性 查看实例属性 实例属性和类属性的区别 访问不可 ...
- Python 进阶_OOP 面向对象编程_类属性和方法
目录 目录 类属性 调用类属性 查看类属性 特殊的类属性 类方法 真构造器 __new__ 类属性 在理解类属性之前要先搞清楚 实例属性 和 函数属性 之间的区别: 1. 实例属性:指的是实例化类对象 ...
- Python 进阶_OOP 面向对象编程_类和继承
目录 目录 类 最简单的类 类方法 构造器 __init__ 创建一个类 实例化一个对象 调用实例的方法和属性 创建子类 使用 super 来调用父类的构造器 实例化子类对象 调用子类的属性和方法 类 ...
- Python 进阶_OOP 面向对象编程_静态方法和类方法
目录 目录 静态方法 类方法 使用函数修饰符来声明静态方法和类方法 静态方法 静态方法仅是类中的函数, 不需要绑定实例, 也就是说静态方法的定义不需要传入 self 参数. 静态方法不属于类的某一个实 ...
- python进阶01 面向对象、类、实例、属性封装、实例方法
python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...
- Python进阶之面向对象编程
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...
- Python进阶之面向对象编程(二)
Python面向对象编程(二) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...
- Python进阶之面向对象编程概述
Python面向对象编程(一) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...
随机推荐
- Vulhub搭建
Vulhub是一个比较全面的漏洞集合,收集了近年来许多的重要漏洞,以开源的形式呈现,以docker的形式进行环境配置,提供了更简单的漏洞复现,只需要简单的命令即可实现漏洞复现. 官网 https:/ ...
- Parentheses Sequence微软编程笔试
描述 You are given a sequence S of parentheses. You are asked to insert into S as few parentheses as p ...
- [Codeforces 1178D]Prime Graph (思维+数学)
Codeforces 1178D (思维+数学) 题面 给出正整数n(不一定是质数),构造一个边数为质数的无向连通图(无自环重边),且图的每个节点的度数为质数 分析 我们先构造一个环,每个点的度数都是 ...
- 爬虫之Js混淆&加密案例
需求: 中国空气质量在线监测分析平台是一个收录全国各大城市天气数据的网站,包括温度.湿度.PM 2.5.AQI 等数据,链接为:https://www.aqistudy.cn/html/city_de ...
- python数字图像处理(五) 图像的退化和复原
import cv2 import numpy as np import matplotlib.pyplot as plt import scipy import scipy.stats %matpl ...
- [USACO06FEB]摊位预订Stall Reservations(贪心)
[USACO06FEB]摊位预订Stall Reservations 题目描述 Oh those picky N (1 <= N <= 50,000) cows! They are so ...
- redis开发规范阿里云
一.键值设计 1.key名设计 1) 可读性和可管理性: 以业务名或数据库名为前缀,以防key冲突,用冒号分隔,比如业务名:表名:ID 2)简洁性: 保证语义的前提下,控制key的长度,当key较多 ...
- hadoop+spark集群搭建
1.选取三台服务器(CentOS系统64位) 114.55.246.88 主节点 114.55.246.77 从节点 114.55.246.93 从节点 之后的操作如果是用普通用户操作的话也必须知道r ...
- PhpStorm中如何使用database工具
环境:ubuntu18.4 mysql5.7 一. 打开database 1.选择View—>Tool Windows—>Database单击打开. 2.新增数据连接 选择 “+”—> ...
- phpstrom 安装
环境: ubuntu18.4 一. 安装 1. 下载安装包.tar.gz 下载地址:https://www.jetbrains.com/phpstorm/download/#section=linux ...