• Python


    为什么要讲 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 就是谁!
  • 相关阅读:
    !ps之前一次执行的内容
    shortcut switch in terminal start pos & end pos
    百度词典搜索_dress code
    修杰楷_百度百科
    红米让夏新没活路了,
    绝杀600元以下智能手机的夏新小V二代-专栏-速途网
    李宗瑞_百度百科
    监制_百度百科
    文件上传~Uploadify上传控件
    知方可补不足~CSS中的几个伪元素
  • 原文地址:https://www.cnblogs.com/poloyy/p/15190295.html
Copyright © 2020-2023  润新知