为什么要讲 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 参数的更多相关文章

  1. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  2. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

  3. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  4. Python面向对象编程(下)

    本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...

  5. Python 面向对象编程——访问限制

    <无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...

  6. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  7. Python 面向对象编程基础

    Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...

  8. python面向对象编程学习

    python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...

  9. Python面向对象编程——继承与派生

    Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...

随机推荐

  1. xxe 回显与无回显

    转载学习于红日安全 一.有回显 (1)直接将外部实体引用的URI设置为敏感目录 <!DOCTYPE foo [<!ELEMENT foo ANY > <!ENTITY  xxe ...

  2. 聊聊TCP Keepalive、Netty和Docker

    聊聊TCP Keepalive.Netty和Docker 本文主要阐述TCP Keepalive和对应的内核参数,及其在Netty,Docker中的实现.简单总结了工作中遇到的问题,与大家共勉. 起因 ...

  3. LeetCode入门指南 之 链表

    83. 删除排序链表中的重复元素 存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 .返回同样按升序排列的结果链表. class Soluti ...

  4. noip模拟33[进阶啦啦啦]

    noip模拟33 solutions 不知道该咋说,这场考试其实是我这三四场以来最最最最最顺心的一场了 为啥呢?因为我这回思考有很多结果,得到了脑袋的回复 就是你想了半个小时就有了一点点头绪,那感觉就 ...

  5. POJ 1190 生日蛋糕题解

    题目地址:http://poj.org/problem?id=1190 一道很有趣的搜索题--主要是剪枝-- 我弄了5个剪枝: 1.当前剩余层数>=上层半径,剪掉 2.当前剩余层数>=上层 ...

  6. OOP面向对象程序设计原则

    OOP面向对象程序设计原则 开闭原则(Open Close Principle) 对扩展开放,对修改关闭 里氏代换原则(Liskov Substitution Principle) 继承必须确保超累所 ...

  7. GUI编程简介

    GUI编程(淘汰) GUI编程怎么学? 这是什么 它怎么玩 该如何去在我们平时运用 class -- 可阅读 组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事件 破解工具 1 ...

  8. Linux守护进程及Systemd

    当我们启动一个前台任务后,命令行窗口退出,应用也就一起退出,无法访问了.怎么才能让它变成系统的守护进程(daemon),成为一种服务(service),一直在那里运行呢? 守护进程 前台任务和后台任务 ...

  9. [08 Go语言基础-for循环]

    [08 Go语言基础-for循环] 循环 循环语句是用来重复执行某一段代码. for 是 Go 语言唯一的循环语句.Go 语言中并没有其他语言比如 C 语言中的 while 和 do while 循环 ...

  10. Pikachu-Over Permission模块

    一.概述 如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作. 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的. 一般越权漏洞容易出现在权限页 ...