python

当前位置:首页 > python面向对象 > 当前文章

python面向对象

self是什么?__init__要return吗?实例化对象的内存过程

2020-04-04 128赞 老董笔记
每篇文章努力于解决一个问题!更多精品可移步文章底部。

  上一节有1个遗留问题self,为了彻底认识self,我们首先得理解定义1个类并创建1个对象时在内存里发生了什么。

# -*- coding:utf-8 -*-

class Person:
    def __init__(self,my_name,skill):
        print(f'创建对象{my_name}...')
        self.name = my_name  # 实例变量
        self.ability = skill  # 实例变量

    # 实例方法
    def sleep(self,time_num):
        print(f'{self.name}休息{time_num}分钟')


if __name__ =="__main__":
    p1 = Person('乔峰','降龙十八掌')
    p1.sleep(3)
创建对象乔峰...
乔峰休息3分钟

  初始化1个对象就会申请1块内存空间存储该对象,为了完成这个操作,初始化1个对象会经历以下步骤:

  1)定义类(class Person)时会申请一块内存空间,这是类的内存地址,Person指向它。

  2)创建对象(Person())时也会申请一块内存空间,执行__init__方法时该空间的内存地址会自动作为__init__的第1个参数(即self)。

  3)构造方法__init__也可能有其他参数,其内部执行self.xxx=yyy会把参数绑定到对象的内存空间,赋予了对象属性值;

  4)返回self(即返回这个对象)。自动返回,不需要程序员写

  self是什么?

  通过以上流程,我们可以感受到self就代表对象本身,如果创建p1对象就是p1,创建p2对象就是对象p2,self.name=my_name等价于p1.name=my_name。实例化时python解释器会自动把这个对象本身通过self参数传进去。

  self可以改名吗?

  可以,你可以写self也可以写sb,无论写什么,他都会出现在__init__函数参数列表的第一个来代表对象本身。但是为了可读性和通用性在python中默认写成self。

  __init__要return吗?

  不需要。

  如果你多此一举最后写return self。他会报错TypeError: __init__() should return None

  如果你想提前结束__init__可以用单独的return(不带返回值)。如果在__init__方法最后写个return则不影响结果。

# -*- coding:utf-8 -*-

class Person:
    def __init__(self,my_name,skill):
        print(f'创建对象{my_name}...')
        return # 下面的不执行
        self.name = my_name  # 实例变量
        self.ability = skill  # 实例变量


if __name__ =="__main__":
    p1 = Person('乔峰','降龙十八掌')
    print(p1.name) # 报错 'Person' object has no attribute 'name'
创建对象乔峰...
Traceback (most recent call last):
  File "D:/py3script/python66/object/2_2.py", line 13, in <module>
    print(p1.name) # 报错 'Person' object has no attribute 'name'
AttributeError: 'Person' object has no attribute 'name'


文章评论

self是什么?__init__要return吗?实例化对象的内存过程文章写得不错,值得赞赏