• 【转载】在python的class中的,self到底是什么?


    在python的class中的,self到底是什么?

     

    答案:self可以理解为一个字典变量,内部存的就是对象的数据属性。如:{'name':'zhang','age':'18'}就是这些。

    注意只有数据属性,并没有创建新的类的方法。  类----->通过实例化生成----对象---->(对象只是一串类似于字典的数据,没有把类的里的方法复制给你,python没有new这个方法!)

    在python2中分为

    经典类:

    class Box:

      pass

    新式类:

    class Box(object):

      pass

     

    在python3中,只有新式类:

    class Box:

      pass

     

    在python的class中的,self到底是什么?

     

    上实例:

    class.py

    复制代码
     1 class Box:
     2     def __init__(self, boxname, size, color):
     3         self.boxname = boxname
     4         self.size = size
     5         self.color = color  # self就是用于存储对象属性的集合,就算没有属性self也是必备的
     6 
     7     def open(self, myself):
     8         print('-->用自己的myself,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))
     9         print('-->用类自己的self,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))
    10 
    11     def close(self):
    12         print('-->关闭%s,谢谢' % self.boxname)
    13 
    14 
    15 b = Box('魔盒', '14m', '红色')
    16 b.close()
    17 b.open(b)  # 本来就会自动传一个self,现在传入b,就会让open多得到一个实例对象本身,print看看是什么。
    18 print(b.__dict__)  # 这里返回的就是self本身,self存储属性,没有动作。
    复制代码

    以上代码当中:

     

    self 就是 对象/实例 属性的集合,

    他们之间的关系如下:

    1、Box是个类 ——》实例化——》b 对象/实例

     

    2、Box类python中显示为:<class '__main__.Box'>  (接下一行)

    ——》实例化:b=Box('魔盒', '14m', '红色')  (接下一行)

    ——》得到对象/实例b,显示为<__main__.Box object at 0x00000233857AA518> 

     

    3、抽象体  (接下一行)

    ——》实例的过程  (接下一行)

    ——》得对对象,含有属性:{'boxname': '魔盒', 'size': '14m', 'color': '红色'},即self。

     

    self看似是一整个对象,实际上描述明白一个类就是生产对象的过程,描述了self就是得到了对象。所以self内的健值可以直接使用。

    正如自然界中,一个有效的对象,必须包括:1、描述对象的属性;2、对象的方法。

    所以self是必须的,也是对象中重要的特性。

     

    当掌握了这个原理以后,我们试试以下的代码,感觉更加神奇。让我们明白重要的是它的思路:

    class02.py

    复制代码
    class Box:
        def myInit(mySelf, boxname, size, color):
            mySelf.boxname = boxname
            mySelf.size = size
            mySelf.color = color  # 自己写一个初始化函数,一样奏效,甚至不用self命名。其它函数当中用标准self
            return mySelf  # 返回给实例化过程一个对象!神奇!并且含有对象属性/字典
    
        # def __init__(self, boxname, size, color):
        #     self.boxname = boxname
        #     self.size = size
        #     self.color = color  #注释掉原来标准的初始化
    
        def open(self, myself):
            print(self)
            print('-->用自己的myself,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))
            print('-->用类自己的self,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))
    
        def close(self):
            print('-->关闭%s,谢谢' % self.boxname)
    
    
    # 经过改造,运行结果和标准初始化没区别
    
    b = Box().myInit('魔盒', '14m', '红色')
    # b = Box('魔盒', '14m', '红色')#注释掉原来标准的初始化方法
    b.close()
    b.open(b)  # 本来就会自动传一个self,现在传入b,就会让open多得到一个实例对象本身,print看看是什么。
    print(b.__dict__)  # 这里返回的就是self本身,self存储属性,没有动作。
    复制代码

     

    换个角度来讲,

    对类的操作有:1、定义属性  2、调节方法的选项

      ——》在适当的设置以后《———

    类对的反馈有:1、得到属性  2、执行方法

     

    在类的函数当中,self为什么是必要参数,因为他是对象的载体,可以理解成一个字典。

    通过以下代码演示:

    复制代码
     1 class Box:
     2     def myInit(mySelf, boxname, size, color):
     3         print(mySelf.__dict__)#显示为{}空字典
     4         mySelf.boxname = boxname
     5         mySelf.__dict__['aa'] = 'w'#甚至可以像字典一样操作
     6         mySelf.size = size
     7         mySelf.color = color  # 自己写一个初始化函数,一样奏效,甚至不用self命名。其它函数当中用标准self
     8         return mySelf  # 返回给实例化过程一个对象!神奇!并且含有对象属性/字典
     9 
    10     # def __init__(self, boxname, size, color):
    11     #     self.boxname = boxname
    12     #     self.size = size
    13     #     self.color = color  #注释掉原来标准的初始化
    14 
    15     def open(self, myself):
    16         print(self)
    17         print('-->用自己的myself,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))
    18         print('-->用类自己的self,打开那个%s,%s的%s' % (myself.color, myself.size, myself.boxname))
    19 
    20     def close(self):
    21         print('-->关闭%s,谢谢' % self.boxname)
    22 
    23 
    24 # 经过改造,运行结果和标准初始化没区别
    25 
    26 b = Box().myInit('魔盒', '14m', '红色')
    27 # b = Box('魔盒', '14m', '红色')#注释掉原来标准的初始化方法
    28 b.close()
    29 b.open(b)  # 本来就会自动传一个self,现在传入b,就会让open多得到一个实例对象本身,print看看是什么。
    30 print(b.__dict__)  # 这里返回的就是self本身,self存储属性,没有动作。
    复制代码

    执行结果

     

    复制代码
    {}
    -->关闭魔盒,谢谢
    <__main__.Box object at 0x0000026A2CBAA5F8>
    -->用自己的myself,打开那个红色,14m的魔盒
    -->用类自己的self,打开那个红色,14m的魔盒
    {'boxname': '魔盒', 'aa': 'w', 'size': '14m', 'color': '红色'}
    复制代码

     

    注意看:'aa':'w' ,成功设置完成

  • 相关阅读:
    完整版excel上传导入读写批量数据并将反馈结果写入远程exel中
    将数据写入已有的excel文件
    微服务项目启动问题
    通过POI实现上传EXCEL的批量读取数据写入数据库
    [转] VLAN原理详解
    [转载]git tag — 标签相关操作
    [转载]SQLite3性能优化
    [转载]提升SQLite数据插入效率低、速度慢的方法
    [转载]sqlite3遇到database is locked问题的完美解决
    一个Linux下C线程池的实现(转)
  • 原文地址:https://www.cnblogs.com/xuanbjut/p/10927934.html
Copyright © 2020-2023  润新知