python内置函数面向对象_Pyhton——面向对象进阶二:类的内置函数补充、描述符...

Pyhton——面向对象进阶二:

一、类的内置函数补充

1、isinstance(obj,cls)——检查obj是否是该类的对象

class Hoo:

def __init__(self,name,tem):

self.name = name

self.tem = tem

class foo(Hoo):

pass

f1=foo('e',20)

print(isinstance(f1,Hoo))

首先 f1 肯定是 foo 的对象,如果 Hoo 是 foo 的父类,那么 f1 也同样是 Hoo 的对象。

2、issubclass(sub,super)——检查sub类是否是super类的派生类(子类)

3db16f1936f4754889aaf692fbf42fea.png

3、__getattribute __

首先 __getattribute __ 与前面的 __getattr __ 很像,当然他们实际的功能也类似:

b0ba2790c910ea6aea35ae8e69cebdd8.png

可以看到,当执行不存在的方法时,应该是执行 __getattr __ 的,但是现在执行的却是 __getattribute __ ;接着我们看下,如果执行的是存在的方法呢?

57622844f31eb5a5fd0c7d7d5af51cdb.png

可以看到,当执行的方法是存在的时候,依然执行的是 __getattribute __ 。所以,无论执行的方法存不存在,都会执行 __getattribute __ 。

那么这个方法有什么作用呢?跟__getattr __ 又有什么联系呢?首先先来看下,当执行一个不存在的方法时,其报错的异常

f9f606e60516acc824ba082b1c09411d.png

这是原本的异常。

在__getattribute __方法中,可以通过 raise AttributeError 来发出你想要发出的异常

4aea588f3d337a2c99a63b979ad9adba.png

如果此时 __getattribute __ 与 __getattr __ 同时存在会发生什么呢?

a297ef3a9fdd885f8cbc7cf3206c3aa0.png

从以上结果可以看到,当这两个方法同时存在,且执行类里面没有的方法时,是不会发出异常的,本该出现的异常被 __getattr __接去了,

4、__setitem __ 、__getitem __ 与 __delitem __

这三个与前面的 attr 函数很类似,功能也差不多。直接上结论。

attr 函数主要是通过 点 的方式触发,当通过 点 来调用方法时,就会触发 attr 函数。而 item 函数主要是通过字典来触发,当用字典来操作的时候,就会触发 item 函数

97c6c9394c004a50b5ad89f5cfa9e267.png

从上面的结果可以印证上面的结论

如果要完成本来的功能,看下:

def __setitem__(self, key, value):

self.__dict__[key] = value

def __getitem__(self, item):

return self.__dict__[item]

def __delitem__(self, key):

self.__dict__.pop(key)

5(1)、__str __ ——打印显示方式

dbff7795158ee9fe624101c1d619f215.png

f1 是类的实例化对象,直接打印这个对象,会显示这么一串东西。如果我们想要显示别的行不行?

2f615ccae4889d0a23debc60a89211e9.png

修改此 str 就可以显示自己要显示的东西

5(2)、__repr __ ——打印显示方式

2baf2ee4c39e22e5fd4003bb1050708b.png

可以看到这里 repr 也能显示自定义打印方式

同样是打印显示方式,str 与 repr 有什么区别呢?

repr 主要在解释器中触发

那么 repr 与 str 同时存在会打印哪个?

588f21888be093b1e8b5d29288ad7fc2.png

两个同时存在的情况下,调用的是 str ,但并不是优先执行谁,而是 print 本质调用的是 str方法,如果 找不到 str ,就会去找 repr 这个替代品

注意:str 与 repr 返回值必须是字符串,否则会抛出异常

6、自定制 format 方法

方法:略

主要通过运用字典的方式来自定制

7、slots 属性

8bc7c8cc7501c9848fae8d72c0bb800e.png

用法举例:

ff4f770da9898d9f5253eda5095f7e78.png

此方法用得少,用的时候慎用

8、__doc __ ——文档描述信息

该属性无法被继承

37375223dcfee1237abea7446edb9fb5.png

9、__module __和__class __ ——查看对象来自于哪一个模块或类

e6f32b40475fe7a9525f89ee0cbcc7f9.png

10、__del __ ——析构方法

cfefc41b8e63ededcc6f351848391323.png

b8722982803bc40bdfd4e7637675fe89.png

d993cd8944d9a0cd0c5fa4383cf767e2.png

f61b5503fe9767937d1f3ad55df21297.png

结论:从上面三个结果中看出,只有实例被删除的时候才会触发 __del __ ;单单删除实例下的属性不会触发;文件执行完毕,实例被回收,触发__del __。

11、__call __

a2c2cbb624cb3a8c44f2adcc3febdece.png

90aa9a13ac525fe4524ebd4bfaf6dd0f.png

foo 虽然是一个类,但是也是一个对象(既然是对象,就有另外一个类来产生)

12(1)、__iter __ 与 __next __ ——迭代器协议

3562efbb93e8b461c4a1f6d707b8de5c.png

其它的暂略… …

12(2)、迭代器协议实现斐波那契数列

4c15a41ac62449ad32a81e1f674f3833.png

二、描述符(__get __、__set __、__delete __)

普通开发中用不到,开发大型的框架,给别人用的时候才用得到

1、描述符的定义

36c8e305bf09a0bc81824374c1c48f81.png

2、描述符的作用

描述符的作用:是用来代理另外一个类的属性(必须把描述符定义成这个类的类属性,不能定义到构造函数中)

d7308fa1329bd54d687d48201718739b.png

从上图中看到,无论怎么调用,都无法触发里面的方法,问题在于,描述符是代理另外一个类的属性,所以,必须要其他的类来调用,才能触发。看下图:

b2f89153d9a533069560b70ccb46c58b.png

上图中看到,必须是有其他的类来调用描述符,才能触发描述符方法

3、两种描述符

描述符分两种

4d023ae963730e3ad9be93524aefe984.png

620309d8ce671b6ff22391454acfbb55.png

注意事项:

一、描述符本身应该定义成新式类,被代理的类也应该是新式类

二、必须把描述符定义成这个类的类属性,不能定义为构造函数中

f3ac0ed50759ec1f11542bf5d10114b2.png

比如上图这个,定义成这种就不行,什么都不会触发。再看下图:

c7ae95175d00a6165762835feb16bf72.png

这种是可以触发的。在上图 类hoo 当中,x被 foo 描述了,所以凡是关于 x 的操作都是 foo的操作 ;x被 foo 代理了。

三、要严格遵循该优先级,优先级由高到低分别是:

1.类属性

2.数据描述符

3.实例属性

4.非数据描述符

5.找不到的属性触发__getattr__()

原文链接:https://blog.csdn.net/qq_41824825/article/details/111641808

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue项目打包后部署到服务器(超详细步骤)

耽误了几天, 终于开始写第二篇博客了, 这篇会讲怎么将vue项目打包部署到服务器, 其实和上一篇的uni-app步骤一样的, 就是最后多了一步修改nginx配置, 好 , 上操作 一 ,打包项目 vscode下载链接:https://pan.baidu.com/s/1ibHt7XB6EZy37BDb1CigWw 提取码&#xff1…

postman怎么不登陆使用_最新百度云不限速,免安装、免登陆、不限速,打开网站就能使用...

上次给大家安利了一波Pandownload手机版/电脑版。那篇文章中也说了,这类应用使用不当可能会遇到账号被限速的情况,而且手机版必须登录才能进行不限速下载。总之,凡是没登录账号的小伙伴,下载过程会非常曲折。那么是否有无需登录就…

vue项目配置打包测试环境/生产环境

vue项目配置打包测试环境/生产环境: 开发环境运行命令:npm run serve 生产环境打包命令:npm run pro 测试环境打包命令:npm run build 步骤: 1.项目中添加一个配置ip的js文件,比如如下的ip-config.js&…

SpringMVC访问WEB-INF下的jsp解决方案Spring Boot集成使用jsp

SpringMVC访问WEB-INF下的jsp解决方案 一. 问题 ​将项目中用到的jsp等文件放在WEB-INF目录下。实际开发过程中,需要在框架页面通过iframe嵌入对应的具体页面,此处如果直接调用对应页面所在的url地址,则会提示404错误。 ​ WEB-INF目录下的…

SpringBoot | 详解SpringBoot配置文件及其原理

文章目录一、配置文件二、YAML语法1、基本语法2、值的写法(1)、字面量:普通的值(数字,字符串,布尔)(2)、对象、Map(属性和值)(3)、数组(List、Set)三、配置文件值注入1、…

【深入理解JVM】:Java内存模型JMM

多任务和高并发的内存交互 多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题,它代表着一秒内服…

You may use special comments to disable some warnings.Use // eslint-disable-next-line to ignore...

vue没写什么爆红 错误原因 ESLint] 对语法的要求过于严格导致编译的时候报上图那些错误。 要知道,这并不是代码有异常,而是代码格式有问题,这些错误并不会影响代码的执行结果。 解决方法 很简单,既然是ESLint 语法错误&#xff…

java jni 原理_JNI的实现原理

JNI接口函数和指针Java虚拟机访问本机代码通过调用JNI的功能特性。JNI的功能都可以通过一个接口指针。一个接口指针是一个指向指针的指针。这个指针指向一个一个指针数组,这个数组中的每一个成员指向一个函数入口。每个接口的功能是在一个预定义的内部数组的偏移量。…

jQuery ajax读取本地json文件_jQuery请求本地JSON文件,在谷歌浏览器运行时报跨域错误_Vscode使用Live Server

json文件 {"first":[{"name":"张三","sex":"男"},{"name":"李四","sex":"男"},{"name":"王武","sex":"男"},{"name":"李…

Vue打包并发布项目

一、 打包vue项目步骤: 1、对当前vue项目进行打包的命令如下: npm run build2、打包完成,会输出Build complete并且在vue项目中会生成一个名字为dist的打包文件。如下图: 二、 使用静态服务器工具包发布打包的vue项目 1、首先…

Grammarly:最优秀的日常英文写作辅助工具——论文英文校验

使用Grammarly也有一些心得,在此分享给大家。 1,Grammarly是什么? Grammarly是一款在线语法纠正和校对工具,支持Windows、Mac、iOS和Android等多个平台。它能够检查单词拼写、纠正标点符号、修正语法错误、调整语气以及给出风格…

SpringMVC @RequestBody和@ResponseBody原理解析

SpringMVC RequestBody和ResponseBody原理解析 前言 RequestBody作用是将http请求解析为对应的对象。例如: http请求的参数(application/json格式): {"accountId": 10,"adGroupId": "12345678",…

java 高性能缓存_高性能Java缓存----Caffeine

简单介绍Caffeine是新出现的一个高性能的Java缓存,有了它完全可以代替Guava Cache,来实现更加高效的缓存;Caffeine采用了W-TinyLFU回收策略,集合了LRU和LFU的优点,提供了一个最佳的命中率,在效率上可以秒杀…

@ResponseBody 转化成json后与实体类字段名不一致_SpringMVC字符串解析成json对象(@RequestBody注解和@ResponseBody注解)

ResponseBody 转化成json后与实体类字段名不一致 实体类A字段名由B改成C后,Controller 中返回的List中字段名仍然是C 经过ResponseBody返回到前台后又变成了B 后来发现公司项目采用的是阿里的fastjson, 是开源的Json格式化工具库 此工具库是根据实体类…

java togglebutton_ToggleButton和Switch使用大全

本文转载自:Android零基础入门第21节:ToggleButton和Switch使用大全http://www.apkbus.com/blog-205190-68463.html(出处: 安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户),转载应备注出处,尊重原创上期学习了CheckB…

MyBatis之工作原理,简单实体的增加、修改、删除、查询_Mybatis-原理总结

一、MyBatis之工作原理 MyBatis是一个半自动映射框架。所谓半自动,是相对Hibernate全表映射而言的,MyBatis需要手动匹配提供POJO、SQL和映射关系。 我们知道,JDBC有四个核心对象: (1)DriverManager&#…

MySQL优化:如何避免回表查询?_什么是索引覆盖?

数据库表结构: create table user (id int primary key,name varchar(20),sex varchar(5),index(name) )engineinnodb;select id,name where nameshenjianselect id,name,sex where nameshenjian多查询了一个属性,为何检索过程完全不同? 什…

mysql提示Column count doesn‘t match value count at row 1错误

我们在对数据库进行添加信息时可能会遇到如下错误: Column count doesn’t match value count at row 1 该错误的意思是传入表的字段数和values值的个数不一样 我总结了一下,主要有3个易错点: 1.要传入表中的字段数和values后面的值的个数不…

java 阅发布模式_redis发布订阅模式

一 前言虽然有消息队列,我们还是要了解一下redis发布订阅模式哟!!!!!二发布订阅模式PUBLISH 命令向通道发送信息,此客户端称为publisher 发布者;SUBSCRIBE 向命令通道订阅信息&#…

把实体 转为json 数据格式---jackson 的详细用法_Jackson快速入门

首先介绍三个注解: JsonAutoDetect (method/field):作用于方法或字段,用来表明,当生成json的时候忽略有该annotation的方法或字段 JsonIgnore 过滤不需要转成json的属性 JsonIgnoreProperties 主要用于过滤掉一些不需要的属性 以上三个注…