Python - 面向对象编程 - self 参数

简介: 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 就是谁!
相关文章
|
4天前
|
Python
【Python进阶(三)】——面向对象编程
【Python进阶(三)】——面向对象编程
|
3天前
|
机器学习/深度学习 数据采集 自然语言处理
python函数参数的传递、带星号参数的传递,2024年大厂Python高级面试题分享
python函数参数的传递、带星号参数的传递,2024年大厂Python高级面试题分享
|
4天前
|
C++ 计算机视觉 Python
【学习什锦】python中的匿名函数(lambda)与max、key参数
【学习什锦】python中的匿名函数(lambda)与max、key参数
10 3
|
4天前
|
Java C# 开发者
Python 中的类型注解是一种用于描述变量、函数参数和返回值预期类型的机制
【5月更文挑战第8天】Python的类型注解提升代码可读性和可维护性,虽非强制,但利于静态类型检查(如Mypy)。包括:变量注解、函数参数和返回值注解,使用内置或`typing`模块的复杂类型,自定义类型注解,以及泛型模拟。类型注解可在变量声明、函数定义和注释中使用,帮助避免类型错误,提高开发效率。
23 6
|
4天前
|
机器学习/深度学习 自然语言处理 算法
Python遗传算法GA对长短期记忆LSTM深度学习模型超参数调优分析司机数据|附数据代码
Python遗传算法GA对长短期记忆LSTM深度学习模型超参数调优分析司机数据|附数据代码
|
4天前
|
机器学习/深度学习 算法 Python
【Python机器学习专栏】机器学习中的超参数调优技术
【4月更文挑战第30天】本文探讨了机器学习中超参数调优的重要性,介绍了网格搜索、随机搜索、贝叶斯优化和AutoML等调优方法,并提供了Python中使用`scikit-learn`进行网格搜索的示例。超参数的选择直接影响模型学习和泛化能力,而调优技术能帮助找到最佳组合,提升模型性能。随着AutoML的发展,自动化调参将成为更高效的选择。
|
4天前
|
算法 Java 程序员
[重学Python] Day6 面向对象编程 基础
面向对象编程基础讲解,包括类与对象的概念,类是对象的模板,对象是类的实例。Python中使用`class`定义类,通过`__init__`初始化对象。创建对象并调用方法如`drive`和`target_client`。访问权限在Python中相对宽松,使用单下划线表示受保护的属性。面向对象的三大支柱是封装、继承和多态,封装是隐藏实现细节,仅暴露简单接口。提供了数字时钟和平面上的点的类定义作为练习示例。
14 0
|
4天前
|
人工智能 数据挖掘 Python
Python pandas中read_csv函数的io参数
Python pandas中read_csv函数的io参数
25 5
|
4天前
|
运维 算法 Shell
第六章 Python类(面向对象编程)
第六章 Python类(面向对象编程)
|
4天前
|
Python
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念