Python - 面向对象编程 - self 参数
为什么要讲 self 参数
- class PoloBlog:
- def __init__(self):
- ...
- def say(self):
- ...
在类里面,所有实例方法都需要加 self 参数,且排在第一个,有且仅有一个
self 参数的含义
在类中定义的方法,第一个参数 self 指向调用该方法的实例对象,在方法中通过 self.属性 这样的形式访问对象的实例属性
self 参数真的必须叫 self 吗
- 其实并不是哦
- Python 只是规定,无论是构造方法还是实例方法,最少要包含一个参数,并没有规定该参数的具体名称
- 之所以将其命名为 self,只是约定俗成的一种习惯,遵守这个约定,可以使我们编写的代码具有更好的可读性,大家一看到 self,就知道它的作用
- 你想叫 polo 也可以
- class test:
- def __init__(polo):
- polo.name = "小菠萝"
- def test(polo):
- print(polo.name)
- t = test()
- t.test()
- # 输出结果
- 小菠萝
只是可读性很差
如何理解 self 参数
类比
- 如果把类比作造房子的图纸
- 类实例化后的对象是真正可以住的房子
- 根据一张图纸(类),可以设计出成千上万的房子(实例对象)
- 每个房子长相都是类似的(都有相同的实例属性和实例方法),但它们都有各自的主人
- 如何区分不同的房子:通过 self 参数,可以保证每个房子的主任仅能进入自己的房子(每个实例对象只能调用自己的实例属性和实例方法)
重点
- 一个类可以产生多个实例对象,当某个实例对象调用实例方法,该对象会把自身的引用作为第一个参数自动传递给该方法
- 换句话说:Python 会自动将实例方法的第一个参数指向调用该方法的对象
- 这样,Python 解释器就知道到底要执行哪个对象的实例方法了
- 调用实例方法的时候,不需要手动为第一个参数传值
通过代码了解 self
- # self
- class PoloBlog:
- def __init__(self):
- print("构造方法:self is ", self, " self 的 id is ", id(self))
- def say(self):
- print("实例方法:self is ", self, " self 的 id is ", id(self))
- # 实例对象一
- blog1 = PoloBlog()
- blog1.say()
- print("实例对象 blog1 id is ", id(blog1))
- # 实例对象2
- blog2 = PoloBlog()
- blog2.say()
- print("实例对象 blog2 id is ", id(blog2))
- # 输出结果
- 构造方法:self is <__main__.PoloBlog object at 0x10f884af0> self 的 id is 4555557616
- 实例方法:self is <__main__.PoloBlog object at 0x10f884af0> self 的 id is 4555557616
- 实例对象 blog1 id is 4555557616
- 构造方法:self is <__main__.PoloBlog object at 0x10f884ac0> self 的 id is 4555557568
- 实例方法:self is <__main__.PoloBlog object at 0x10f884ac0> self 的 id is 4555557568
- 实例对象 blog2 id is 4555557568
- 很明显,self 存的就是调用该实例方法的实例对象的引用
- 所以!谁调用实例方法,self 就是谁!
Python - 面向对象编程 - self 参数的更多相关文章
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- Python面向对象编程(下)
本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...
- Python 面向对象编程——访问限制
<无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- Python 面向对象编程基础
Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...
- python面向对象编程学习
python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...
- Python面向对象编程——继承与派生
Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...
随机推荐
- 简单的Postman,还能玩出花?
Postman是一款我们在工作中使用频率非常高的API调试工具,估计很多童鞋在使用它时也比较粗暴,填好接口地址.参数,直接send就完事了,估计大家要说了,这么简单的东西还能玩出什么花来.今天就和大家 ...
- 字节跳动Android实习面试难吗,应该如何应对?
字节跳动的面试难不难其实很难去非常准确的定义,但是能肯定的一点是,字节跳动的面试题都很有水平,真正考察了该岗位在以后工作中需要的能力. 大学学的Java后面又自学Android方向,跟着老师在实验室做 ...
- 探讨UE4中的UBT和UHT
前言 UBT和UHT是编译工具,谁定义的呢,虚幻引擎自己定义的,拿来做什么呢,UBT和UHT是UE4用来简化多平台编译,去除用户自定义平台编译项目的操作 我们写的UE4代码不是标准的C++代码,是基于 ...
- Azure 实践(1)- Azure Devops Server 安装
1.Azure Devops介绍 Azure DevOps Server 2020 (之前的名称为TFS),作为微软Azure DevOps 的企业私有(on-premises)服务器,是一个为开发团 ...
- MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用
转载自 MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用 LambdaQueryWrapper https://blog.csdn.net/lt32603 ...
- MySQL-08-索引简介
B树 基于不同的查找算法分类介绍 B*Tree B-tree B+Tree 在范围查询方面提供了更好的性能(> < >= <= like) 索引简介 索引作用 提供了类似于书中 ...
- 深入理解-dl_runtime_resolve
深入理解-dl_runtime_resolve 概要 目前大部分漏洞利用常包含两个阶段: 首先通过信息泄露获取程序内存布局 第二步才进行实际的漏洞利用 然而信息泄露的方法并不总是可行的,且获取的内存信 ...
- 003 PCI Express体系结构(三)
一.PCI总线的存储器读写总线事务 总线的基本任务是实现数据传送,将一组数据从一个设备传送到另一个设备,当然总线也可以将一个设备的数据广播到多个设备.在处理器系统中,这些数据传送都要依赖一定的规则,P ...
- 【工作篇】再次熟悉 SpringMVC 参数绑定
前言 主要现在项目中使用的参数绑定五花八门的,搞得很头大,例如有些用字符串接收日期,用字符串接受数组等等,完全没有利用好 SpringMVC 的优势,这里自己也总结一下,免得到时又要百度谷歌查找. 以 ...
- Oracle 数据库的导入与导出
1.导入 打开cmd,用管理员登录:sqlplussys as sysdba密码不用输: 创建表空间:create tablespace tablespaceName datafile 'E:\tab ...