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& ...
随机推荐
- Django 无法通过request.POST.get()获取数据的问题
原来是contentType为application/json时,Django不支持request.POST.get(),但可以通过request.body来获取string类型的参数: data = ...
- 查找idt table 所對應的page table in Linux
#include <linux/kernel.h> #include <linux/module.h> #include <linux/types.h> #incl ...
- C#设计模式:建造者模式(Builder Pattern)
一,建造者模式(Builder Pattern) using System; using System.Collections.Generic; using System.Linq; using Sy ...
- BUUCTF--刮开有奖
文件链接:https://buuoj.cn/files/abe6e2152471e1e1cbd9e5c0cae95d29/8f80610b-8701-4c7f-ad60-63861a558a5b.ex ...
- Android禁止输入表情符号
在我们Android开发的项目中,难免有要求在输入框中禁止输入表情,所以呢,写了一个输入框禁止输入表情的demo,供大伙参考 效果图 如图显示,如果用户输入了表情字符,会提示. EmojiFilter ...
- SpringCloud Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded
出现此问题,有可能是spring cloud 与spring boot 版本不匹配引发的问题,此次用的版本是:Finchley.RC1 经过一番关键字查找,发现spring cloud 与spring ...
- 关于手机端在同一个Grid中使用不同的布局展现即Layout的使用
标题可能说的不是很清楚,我举个栗子好了,现在你正在写手机端的一个审批模块,这个模块要求能够展示所有待审批的信息 比如出差申请,请假申请,加班申请,以及报销申请 那么我的思路有两个 1:建立一个Tab页 ...
- linux系统使用和优化的原则
- go语言从例子开始之Example31.定时器
我们常常需要在后面一个时刻运行 Go 代码,或者在某段时间间隔内重复运行. Go 的内置 定时器 和 打点器 特性让这些很容易实现.我们将先学习定时器,然后再学习打点器. Example: packa ...
- mysql授予权限
grant show databases on *.* to 'asg'@'%'; grant select on *.* to 'asg'@'%'; grant show view on *.* t ...