位置: 编程技术 - 正文

全面理解Python中self的用法(如何理解python语言)

编辑:rootadmin

推荐整理分享全面理解Python中self的用法(如何理解python语言),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:如何理解python语言,python的了解,全面系统python3.8入门+进阶,python的理解,怎样理解python的题目,深入理解python,python的quantile,怎样理解python的题目,内容如对您有帮助,希望把文章链接给更多的朋友!

刚开始学习Python的类写法的时候觉得很是麻烦,为什么定义时需要而调用时又不需要,为什么不能内部简化从而减少我们敲击键盘的次数?你看完这篇文章后就会明白所有的疑问。

self代表类的实例,而非类。

实例来说明:

执行结果如下

从上面的例子中可以很明显的看出,self代表的是类的实例。而self.class则指向类。

self不必非写成self

有很多童鞋是先学习别的语言然后学习Python的,所以总觉得self怪怪的,想写成this,可以吗?

当然可以,还是把上面的代码改写一下。

改成this后,运行结果完全一样。

当然,最好还是尊重约定俗成的习惯,使用self。

self可以不写吗

在Python的解释器内部,当我们调用t.prt()时,实际上Python解释成Test.prt(t),也就是说把self替换成类的实例。

有兴趣的童鞋可以把上面的t.prt()一行改写一下,运行后的实际结果完全相同。

实际上已经部分说明了self在定义时不可以省略,如果非要试一下,那么请看下面:

运行时提醒错误如下:prt在定义时没有参数,但是我们运行时强行传了一个参数。

由于上面解释过了t.prt()等同于Test.prt(t),所以程序提醒我们多传了一个参数t。

当然,如果我们的定义和调用时均不传类实例是可以的,这就是类方法。

全面理解Python中self的用法(如何理解python语言)

运行结果如下

在继承时,传入的是哪个实例,就是那个传入的实例,而不是指定义了self的类的实例。

先看代码

运行结果如下

解释:

运行c.cprt()时应该没有理解问题,指的是Child类的实例。

但是在运行c.pprt()时,等同于Child.pprt(c),所以self指的依然是Child类的实例,由于self中没有定义pprt()方法,所以沿着继承树往上找,发现在父类Parent中定义了pprt()方法,所以就会成功调用。

在描述符类中,self指的是描述符类的实例

不太容易理解,先看实例:

运行结果如下:

大部分童鞋开始有疑问了,为什么在Desc类中定义的self不是应该是调用它的实例t吗?怎么变成了Desc类的实例了呢?

注意:此处需要睁大眼睛看清楚了,这里调用的是t.x,也就是说是Test类的实例t的属性x,由于实例t中并没有定义属性x,所以找到了类属性x,而该属性是描述符属性,为Desc类的实例而已,所以此处并没有顶用Test的任何方法。

那么我们如果直接通过类来调用属性x也可以得到相同的结果。

下面是把t.x改为Test.x运行的结果。

题外话:由于在很多时候描述符类中仍然需要知道调用该描述符的实例是谁,所以在描述符类中存在第二个参数ins,用来表示调用它的类实例,所以t.x时可以看到第三行中的运行结果中第二项为<main.Test object at 0xAB8>。而采用Test.x进行调用时,由于没有实例,所以返回None。

从OO的本质理解python中的self举个栗子,假设我要对用户的数据进行操作,用户的数据包含name和age。如果用面向过程的话,实现出来是下面这样子的。

可以看到,对用户的各种操作,都要传user参数进去。如果用面向对象的话,就不用每次把user参数传来传去,把相关的数据和操作绑定在一个地方,在这个类的各个地方,可以方便的获取数据。之所以可以在类中的各个地方访问数据,本质就是绑定了self这个东西,它方法的第一个参数,当然可以不叫self,叫其它名字,self只不过是个约定。下面是面向对象的实现,可以看到,结构化多了,清晰可读。

从上面这个例子可以看出,其实面向对象挺有用的,只不过大多数人抽象的不好,封装的不好,错误的运用。

总结

self在定义时需要定义,但是在调用时会自动传入。 self的名字并不是规定死的,但是最好还是按照约定是用self self总是指调用时的类的实例。

Python中规范定义命名空间的一些建议 API的设计是一个艺术活。往往需要其简单、易懂、整洁、不累赘。很多时候,我们在底层封装一个方法给高层用,而其它的方法只是为了辅助这个方法

在Python的Flask框架中构建Web表单的教程 尽管Flask的request对象提供的支持足以处理web表单,但依然有许多任务会变得单调且重复。表单的HTML代码生成和验证提交的表单数据就是两个很好的例子

使用Python的Flask框架构建大型Web应用程序的结构示例 虽然小型web应用程序用单个脚本可以很方便,但这种方法却不能很好地扩展。随着应用变得复杂,在单个大的源文件中处理会变得问题重重。与大多数

标签: 如何理解python语言

本文链接地址:https://www.jiuchutong.com/biancheng/387571.html 转载请保留说明!

上一篇:举例讲解Python中字典的合并值相加与异或对比(在python中的用法)

下一篇:Python中规范定义命名空间的一些建议(python代码规范化)

  • 印花税征税对象包括哪些
  • 履约保证金打到哪个账户
  • 研发人员的社保也要进入研发费用吗
  • 来料加工生产成本账务处理
  • 私营小微企业可以贷款吗
  • 企业注销当月无法申报个税
  • 跨期发票可以申报抵扣进项税额吗?
  • 部门会议要点
  • 长期股权投资的初始计量
  • 自营方式建造固定资产增值税
  • 应交税费里的应交企业所得税意思是交了吗
  • 现金收取业务办理流程
  • 单位购买小汽车一次性进成本报表怎么填写?
  • 营改增后企业所得税不能跨年
  • 企业所得税退税怎么做账务处理
  • 计提附加税的会计分录
  • 高新技术企业认定条件
  • 购物车内广告收入应该怎么缴税?
  • 成本费用的结转方法
  • 原始凭证填写错误,可撕毁重新编制一张
  • 实收资本减少会不会变相影响注册资本金
  • 政府补贴收入账户是什么
  • 增值税发票金额是含税还是不含税价
  • 收到上月发票怎么写分录
  • 哪些费用可以税前扣除
  • 销售净利率怎么分析盈利能力
  • 银行自动扣费用是什么
  • 职工教育经费是工资总额的多少
  • 光伏发电 电费
  • 几个人注册公司好还是个体户好
  • windows10闹钟不响
  • php环境中可毒
  • php基础函数
  • 免抵退应退税额15栏怎么填进去
  • win10蓝牙无法连接可以尝试以下操作
  • 增值税常见账务处理方法
  • Vue3通透教程【三】Vue3代码初体验找不同
  • 干货!​如何打造我们自己的“ChatGPT”?| 大佬思辨
  • php隐藏图片地址
  • php不同用户登录不同页面
  • 员工报销凭证怎么做
  • 估价入库怎么记账
  • 企业为其他企业担保有什么责任
  • 开发项目完工后多久开工
  • 电子承兑汇票到期怎么收款
  • 预收账款挂多久确认收入
  • 社保可以直接计入费用吗
  • 管理费用 暂估入账
  • 预收账款是负债增加还是减少
  • 为什么出口退税率低于适用税率
  • 职工辞退福利是否要申报个税
  • 主营业务成本如何设置明细
  • 佣金如何做账分录
  • 企业注销前是不是资产必须处理完
  • 会计核算和监督两项基本会计职能是相辅相成
  • mysql索引类型及原理
  • mysql查询包含
  • 复合索引顺序
  • window 启动
  • winxp和win7双系统安装
  • linux中的ssh命令
  • xp启用telnet
  • win10系统开机蓝屏得重启后才能开机
  • win8旗舰版官方下载
  • win8无法安装inter显卡驱动
  • ubuntu用root运行
  • javascript中数组
  • 数组observer
  • js数组操作函数
  • 拖拽js实现
  • hbuilderx打包app教程
  • js实现表单提交
  • python指令生成脚本
  • bootstrap基础教程书籍
  • nodejs init
  • 用js自动判断浏览记录
  • 公司可以报停吗
  • 金税工程什么意思
  • 登录上海电子税务局显示获取公告失败
  • 小规模印花税2023减半吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设