在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' ,成功设置完成

 

posted @ 2018-02-26 16:28  Python信仰  阅读(41899)  评论(1编辑  收藏  举报