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

【转载】在python的class中的,self到底是什么?的更多相关文章

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

    答案:self可以理解为一个字典变量,内部存的就是对象的数据属性.如:{'name':'zhang','age':'18'}就是这些. 注意只有数据属性,并没有创建新的类的方法.  类-----> ...

  2. (转载)python调用shell命令之os 、commands、subprocess

    linux系统下进入python交互式环境: 一.os 模块 1.1.os模块的exec方法簇: python交互界面中: In [1]: import os In [2]: os.exec os.e ...

  3. 随手小代码——Python 从集合中随机抽取元素

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  4. Python统计日志中每个IP出现次数

    介绍了Python统计日志中每个IP出现次数的方法,实例分析了Python基于正则表达式解析日志文件的相关技巧,需要的朋友可以参考下 本脚本可用于多种日志类型 #-*- coding:utf-8 -* ...

  5. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...

  6. [转载]关于python字典类型最疯狂的表达方式

    一个Python字典表达式谜题 让我们探究一下下面这个晦涩的python字典表达式,以找出在python解释器的中未知的内部到底发生了什么. # 一个python谜题:这是一个秘密 # 这个表达式计算 ...

  7. 转载:python操作excel表格(xlrd/xlwt)

    python操作excel表格(xlrd/xlwt)   最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,而 ...

  8. 使用Python将Excel中的数据导入到MySQL

    使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...

  9. 【python】类中的self

    在python的类中,经常会写self,代表对象自己.如下例: #coding=utf-8 class Foo: def __init__(self, name): self.name = name ...

随机推荐

  1. List集合中的交集 并集和差集

    目录 List集合求交集 并集 差集 Set集合 Lambda表达式 List集合求交集 并集 差集 两种方法求集 Set集合 交集 两个集合中有相同的元素 抽取出来的数据就是为交集 @Test pu ...

  2. 【2020.8.23NOIP模拟赛】失落

    [ 2020.8.23 N O I P 模 拟 赛 ] 失 落 [2020.8.23NOIP模拟赛]失落 [2020.8.23NOIP模拟赛]失落 题目描述 出题人心情很失落,于是他直接告诉你让你求出 ...

  3. Dynamics CRM安装教程九(续):自建证书的CRM项目客户端设置CRM访问

    配置完IFD之后就可以为客户端电脑配置访问CRM了首先到CA证书服务器中把证书下载下来,打开CA服务器的浏览器,输入地址http://stg-ad/certsrv/ 其中stg-ad是机器名之后点击下 ...

  4. 无线网络的应用之aircrack-ng

    在kalilinux的aircracke-ng中.在这儿描述自己所遇到的问题并给予写blog 在使用之前,需要确定是否有对应的支持无线网卡监听的网卡,在虚拟机中需要先将网卡的驱动重定向到虚拟机内 在终 ...

  5. Java刷题-tree

    一.分别按照二叉树先序,中序和后序打印所有的节点. 这道题就是书上的算法思想的实际使用,唯一需要特别注意到的是用递归的方式建树,还是比较巧妙的,因为一棵树的建立过程字符流是重复使用的,用递归的方式对根 ...

  6. Go-22-方法

    方法 Go语言同时有函数和方法,方法的本质是函数,但是方法和函数又有所不同. 函数(function)是一段具有独立功能的代码,可以被反复多次调用,从而实现代码复用. 方法(method)是一个类的行 ...

  7. 分布式锁的实现之 redis 篇

    为什么需要分布式锁 引入经典的秒杀情景,100件商品供客户抢.如果是单机版的话,我们使用synchronized 或者 lock 都可以实现线程安全.但是如果多个服务器的话,synchronized ...

  8. 问题:dependencyManagement和dependencies有什么区别

    dependencyManagement和dependencies有什么区别 一.Maven的包管理 在maven中,dependencyManagement.dependencies和depende ...

  9. PAT 乙级 -- 1014 -- 福尔摩斯的约会

    题目简介 大侦探福尔摩斯接到一张奇怪的字条:"我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm&quo ...

  10. POJ3080方法很多(暴力,KMP,后缀数组,DP)

    题意:       给n个串(n>=2&&n<=10),每个串长度都是60,然后问所有串的最长公共子串,如果答案不唯一输出字典序最小的. 思路:直接暴力,枚举+KMP,后缀 ...