在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到底是什么?的更多相关文章
- 【转载】在python的class中的,self到底是什么?
在python的class中的,self到底是什么? 答案:self可以理解为一个字典变量,内部存的就是对象的数据属性.如:{'name':'zhang','age':'18'}就是这些. 注意只 ...
- Python类中的self到底是干啥的
Python类中的self到底是干啥的 Python编写类的时候,每个函数参数第一个参数都是self,一开始我不管它到底是干嘛的,只知道必须要写上.后来对Python渐渐熟悉了一点,再回头看self的 ...
- python中的cls到底指的是什么
python中的cls到底指的是什么,与self有什么区别? 2018年07月31日 11:13:09 rs勿忘初心 阅读数:7769 作者:秦风链接:https://www.zhihu.com/ ...
- Python进阶-继承中的MRO与super
Python进阶-继承中的MRO与super 写在前面 如非特别说明,下文均基于Python3 摘要 本文讲述Python继承关系中如何通过super()调用"父类"方法,supe ...
- Python Web开发中的WSGI协议简介
在Python Web开发中,我们一般使用Flask.Django等web框架来开发应用程序,生产环境中将应用部署到Apache.Nginx等web服务器时,还需要uWSGI或者Gunicorn.一个 ...
- Django中的request到底有啥属性
Django中的request到底有啥属性呢 Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将 HttpRequest对象 作为第一个参数传入该函 ...
- 在Excel VBA中使用SQL到底优势在哪儿
小爬在之前的博文中多次提到,可以在VBA中写SQL来操作Excel文件,实现各类数据处理和分析需求.那么,你可能有这样的疑问:Excel原生的VBA,数据透视表,数据分析功能不够吗,为啥一定要用SQL ...
- rpm 系 linux 系统中 repo 文件中的 $release 到底等于多少?
rpm 系 linux 系统中 repo 文件中的 $release 到底等于多少? 结论 对于 8 来说,通过以下命令 #/usr/libexec/platform-python -c 'impor ...
- 使用Python将Excel中的数据导入到MySQL
使用Python将Excel中的数据导入到MySQL 工具 Python 2.7 xlrd MySQLdb 安装 Python 对于不同的系统安装方式不同,Windows平台有exe安装包,Ubunt ...
随机推荐
- 阳明-K8S训练营全部文档-2020年08月11日14:59:02更新
阳明-K8S训练营全部文档 Docker 基础 简介 安装 基本操作 Dockerfile Dockerfile最佳实践 Kubernetes 基础 简介 安装 资源清单 Pod 原理 Pod 生命周 ...
- && 与 || 差在哪?-- Shell十三问<第十问>
&& 与 || 差在哪?-- Shell十三问<第十问> 好不容易,进入两位数的章节了... 一路走来,很辛苦吧?也很快乐吧? 在解答本章题目之前,先让我们了解一个概念:r ...
- Clang Static Analyzer-使用手册-编写Checker框架
Clang Static Analyzer-使用手册-编写Checker Checker是这个工具的灵魂 有了checker才可以检查你的代码 相当于就是CSA通过checker定义的检查方法去检查代 ...
- upload-labs通关历程
使用靶场前,先配置php版本为5.2,和下列对应配置. php.ini magic_quotes_gpc Off php<5.3.4 httpd.conf AddType applicatio ...
- 【Java并发】1. Java线程内存模型JMM及volatile相关知识
Java招聘知识合集:https://www.cnblogs.com/spzmmd/tag/Java招聘知识合集/ 该系列用于汇集Java招聘需要的知识点 JMM 并发编程的三大特性:可见性(vola ...
- Linux 磁盘管理(df fu fdisk mkfs mount)
Linux 磁盘管理 Linux磁盘管理好坏直接关系到整个系统的性能问题. Linux磁盘管理常用三个命令为df.du和fdisk. df : 列出文件系统的整体磁盘使用量 du : 检查磁盘空间使用 ...
- 剑指offer--孩子们的游戏(圆圈中最后剩下的数字)
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定一个数m ...
- Two point
利用问题的本身与序列的特新,使用两个下标i, j对序列进行扫描(可以同向扫描,也可以反向扫描),以较低的时间复杂度解决问题,一般是O(n) 例1:给定一个递增的正整数序列和一个正整数M,求序列中的两个 ...
- Mysql通配符的使用
通配符的分类:%百分号通配符: 匹配任意字符,包括0个到多个_下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符. escape:用来转义特定字符 [字符列] :字符列中任何一个 ...
- Josephus问题的queue解法
问题描述 Josephus问题是一个非常古老的问题.它的范型描述为N个人(0到N-1)围成一圈报数,报道M的人会被剔除,直到最后一个人. 要求找出最后一个人的位置或这N个人被剔除的顺序. 解决思路 我 ...