Python中为什么要用self探讨


Posted in Python onApril 14, 2015

接触Python以来,看到类里的函数要带个self参数,一直搞不懂啥麻子原因。晚上特别针对Python的self查了一下,理理。

Python要self的理由

Python的类的方法和普通的函数有一个很明显的区别,在类的方法必须有个额外的第一个参数 (self ),但在调用这个方法的时候不必为这个参数赋值 (显胜于隐 的引发)。Python的类的方法的这个特别的参数指代的是对象本身,而按照Python的惯例,它用self来表示。(当然我们也可以用其他任何名称来代替,只是规范和标准在那建议我们一致使用self)

为何Python给self赋值而你不必给self赋值?

例子说明:创建了一个类MyClass,实例化MyClass得到了MyObject这个对象,然后调用这个对象的方法MyObject.method(arg1,arg2) ,这个过程中,Python会自动转为Myclass.mehod(MyObject,arg1,arg2)

这就是Python的self的原理了。即使你的类的方法不需要任何参数,但还是得给这个方法定义一个self参数,虽然我们在实例化调用的时候不用理会这个参数不用给它赋值。

实例:

class Python:

 def selfDemo(self):

  print 'Python,why self?'

p = Python()

p.selfDemo()

输出:Python,why self?

把p.selfDemo()带个参数如:p.selfDemo(p),得到同样的输出结果

如果把self去掉的话,

class Python:

 def selfDemo():

  print 'Python,why self?'

p = Python()

p.selfDemo()

这样就报错了:TypeError: selfDemo() takes no arguments (1 given)

扩展

self在Python里不是关键字。self代表当前对象的地址。self能避免非限定调用造成的全局变量。

在Python3之后不知道将self隐了没?感觉在Python类里的方法都要带个self这样有点死板

Python 相关文章推荐
Python中的数学运算操作符使用进阶
Jun 20 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
Python实现的单向循环链表功能示例
Nov 10 Python
Python之Scrapy爬虫框架安装及简单使用详解
Dec 22 Python
Python Learning 列表的更多操作及示例代码
Aug 22 Python
Python利用itchat库向好友或者公众号发消息的实例
Feb 21 Python
Pandas数据离散化原理及实例解析
Nov 16 Python
10个Python面试常问的问题(小结)
Nov 20 Python
python对文件的操作方法汇总
Feb 28 Python
django自定义非主键自增字段类型详解(auto increment field)
Mar 30 Python
python 如何调用远程接口
Sep 11 Python
python subprocess pipe 实时输出日志的操作
Dec 05 Python
Python中的特殊语法:filter、map、reduce、lambda介绍
Apr 14 #Python
详解Python中for循环的使用
Apr 14 #Python
Python中join和split用法实例
Apr 14 #Python
Python中__name__的使用实例
Apr 14 #Python
Python中的列表知识点汇总
Apr 14 #Python
Python中使用copy模块实现列表(list)拷贝
Apr 14 #Python
复习Python中的字符串知识点
Apr 14 #Python
You might like
php中定义网站根目录的常用方法
2010/08/08 PHP
php小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
php通过修改header强制图片下载的方法
2015/03/24 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
用js判断输入是否为中文的函数
2014/03/10 Javascript
jQuery中Ajax的get、post等方法详解
2015/01/20 Javascript
javascript中关于&& 和 || 表达式的小技巧分享
2015/04/10 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
原生js实现验证码功能
2017/03/16 Javascript
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
Node.js从字符串生成文件流的实现方法
2019/08/18 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
Python中with及contextlib的用法详解
2017/06/08 Python
浅谈django model postgres的json字段编码问题
2018/01/05 Python
python学生信息管理系统(完整版)
2020/04/05 Python
python面向对象 反射原理解析
2019/08/12 Python
学python需要去培训机构吗
2020/07/01 Python
python matplotlib库的基本使用
2020/09/23 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
物流管理专业职业生涯规划书
2014/01/06 职场文书
金融行业职业生涯规划范文
2014/01/17 职场文书
关于运动会的口号
2014/06/07 职场文书
邻里守望志愿服务活动方案
2014/08/15 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
前台接待岗位职责
2015/02/03 职场文书
单位收入证明范本
2015/06/18 职场文书
Nginx优化服务之网页压缩的实现方法
2021/03/31 Servers
pandas中DataFrame数据合并连接(merge、join、concat)
2021/05/30 Python
python opencv通过4坐标剪裁图片
2021/06/05 Python
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android