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&…

mysql命令实践_MySQL:常用命令行

登入mysql -h192.168.1.110 -uroot -ppassword登出quit/exit查看数据库show databases;用户权限#添加grant select on db.table to userhost;grant select,update on *.* to test%;#撤销revoke all on *.* from test%;#查看show grants;show grants for userlocalhost#删除用户…

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、…

mysql 自连接 树形_自连接表的相关问题(树形结构)

问题一:自连接表肯定是相似 Id(PK),parentId(FK),name ….了Id假如是主键的话,parentId就是外键了,可是树形结构肯定是有根节点了,那么根节点的parentId按理说应该是null,原因是根节点没有父节点,可是主键Id是不能为空…

简述python程序的运行原理_谈谈 Python 程序的运行原理

执行 python demo.py 后,将会启动 Python 的解释器,然后将 demo.py 编译成一个字节码对象 PyCodeObject。在 Python 的世界中,一切都是对象,函数也是对象,类型也是对象,类也是对象(类属于自定义的类型&…

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

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

java 上下文加载器_【深入理解Java虚拟机 】线程的上下文类加载器

线程上下文类加载器线程上下文类加载器( Thread Context ClassLoader) 是从JDK1.2 引入的,类Thread 的getContextClassLoader() 与 setContextClassLoader(Classloader var1) 分别用来设置线程的上下文类加载器。如果没有指定线程的上下文的加载器,那么线…

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

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

java is a like a_JAVA基础——is-a 、have-a、和 like-a的区别

1、is-a,has-a,like-a是什么在面向对象设计的领域里,有若干种设计思路,主要有如下三种:is-a、has-a、like-ajava中在类、接口、抽象类中有很多体现。了解java看这里:什么是Java了解类和对象看这里&#xff…

Java根据日期生成编号

1、Java根据日期生成编号 根据日期生成编号 1、使用 DateTimeFormatter DateTimeFormatter fmt DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");//设置日期格式 String newsNo "xw"LocalDateTime.now().format(fmt);2、使用 SimpleDateFormat Si…

Java数字位数不足前面补0的几种办法

public static void main(String[] args) {int num6; DecimalFormat decimalFormat new DecimalFormat("000000");String numFormat decimalFormat .format(num);System.out.println(numFormat);//打印结果"000006" }Testpublic void test() {this.printT…

java jni 原理_JNI的实现原理

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

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

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

java执行curl命令_Java执行curl命令

Java执行curl命令需要注意的是,命令需要以数组的形式传递参数,就是把正常的命令以空格切分成数组就行了。而且参数前后不能有空格,不然会报错。具体的测试代码如下:import java.io.BufferedReader;import java.io.IOException;imp…

Vue打包并发布项目

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

java线程安全例子_Java总结篇系列:Java多线程(三)

本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题。一.一个典型的Java线程安全例子1 public classThreadTest {23 public static voidmain(String[] args) {4 Account account new Account("123456", 1000);5 DrawMoneyRunnable drawMoneyRunnable …

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

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