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类的派生类(子类)
3、__getattribute __
首先 __getattribute __ 与前面的 __getattr __ 很像,当然他们实际的功能也类似:
可以看到,当执行不存在的方法时,应该是执行 __getattr __ 的,但是现在执行的却是 __getattribute __ ;接着我们看下,如果执行的是存在的方法呢?
可以看到,当执行的方法是存在的时候,依然执行的是 __getattribute __ 。所以,无论执行的方法存不存在,都会执行 __getattribute __ 。
那么这个方法有什么作用呢?跟__getattr __ 又有什么联系呢?首先先来看下,当执行一个不存在的方法时,其报错的异常
这是原本的异常。
在__getattribute __方法中,可以通过 raise AttributeError 来发出你想要发出的异常
如果此时 __getattribute __ 与 __getattr __ 同时存在会发生什么呢?
从以上结果可以看到,当这两个方法同时存在,且执行类里面没有的方法时,是不会发出异常的,本该出现的异常被 __getattr __接去了,
4、__setitem __ 、__getitem __ 与 __delitem __
这三个与前面的 attr 函数很类似,功能也差不多。直接上结论。
attr 函数主要是通过 点 的方式触发,当通过 点 来调用方法时,就会触发 attr 函数。而 item 函数主要是通过字典来触发,当用字典来操作的时候,就会触发 item 函数
从上面的结果可以印证上面的结论
如果要完成本来的功能,看下:
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 __ ——打印显示方式
f1 是类的实例化对象,直接打印这个对象,会显示这么一串东西。如果我们想要显示别的行不行?
修改此 str 就可以显示自己要显示的东西
5(2)、__repr __ ——打印显示方式
可以看到这里 repr 也能显示自定义打印方式
同样是打印显示方式,str 与 repr 有什么区别呢?
repr 主要在解释器中触发
那么 repr 与 str 同时存在会打印哪个?
两个同时存在的情况下,调用的是 str ,但并不是优先执行谁,而是 print 本质调用的是 str方法,如果 找不到 str ,就会去找 repr 这个替代品
注意:str 与 repr 返回值必须是字符串,否则会抛出异常
6、自定制 format 方法
方法:略
主要通过运用字典的方式来自定制
7、slots 属性
用法举例:
此方法用得少,用的时候慎用
8、__doc __ ——文档描述信息
该属性无法被继承
9、__module __和__class __ ——查看对象来自于哪一个模块或类
10、__del __ ——析构方法
结论:从上面三个结果中看出,只有实例被删除的时候才会触发 __del __ ;单单删除实例下的属性不会触发;文件执行完毕,实例被回收,触发__del __。
11、__call __
foo 虽然是一个类,但是也是一个对象(既然是对象,就有另外一个类来产生)
12(1)、__iter __ 与 __next __ ——迭代器协议
其它的暂略… …
12(2)、迭代器协议实现斐波那契数列
二、描述符(__get __、__set __、__delete __)
普通开发中用不到,开发大型的框架,给别人用的时候才用得到
1、描述符的定义
2、描述符的作用
描述符的作用:是用来代理另外一个类的属性(必须把描述符定义成这个类的类属性,不能定义到构造函数中)
从上图中看到,无论怎么调用,都无法触发里面的方法,问题在于,描述符是代理另外一个类的属性,所以,必须要其他的类来调用,才能触发。看下图:
上图中看到,必须是有其他的类来调用描述符,才能触发描述符方法
3、两种描述符
描述符分两种
注意事项:
一、描述符本身应该定义成新式类,被代理的类也应该是新式类
二、必须把描述符定义成这个类的类属性,不能定义为构造函数中
比如上图这个,定义成这种就不行,什么都不会触发。再看下图:
这种是可以触发的。在上图 类hoo 当中,x被 foo 描述了,所以凡是关于 x 的操作都是 foo的操作 ;x被 foo 代理了。
三、要严格遵循该优先级,优先级由高到低分别是:
1.类属性
2.数据描述符
3.实例属性
4.非数据描述符
5.找不到的属性触发__getattr__()
原文链接:https://blog.csdn.net/qq_41824825/article/details/111641808
python内置函数面向对象_Pyhton——面向对象进阶二:类的内置函数补充、描述符...相关推荐
- python类装饰器应用_python之描述符应用与类的装饰器
一.描述符应用 1.1上下文管理协议 在上文中我们提到with语句中的上下文管理器.with语句可以如此简单但强大,主要依赖于上下文管理器.那么什么是上下文管理器?上下文管理器就是实现了上下文协议的类 ...
- matlab二维图形函数,在MATLAB中,画二维图形的常用函数为( )。
[单选题]( )至今仍未走出困境,美欧与俄罗斯由此而展开的战略博弈也仍在持续. [多选题]信号跟踪的主要目的有: [判断题]You have the power to develop the sale ...
- Python之路(第二十七篇) 面向对象进阶:内置方法、描述符
一.__call__ 对象后面加括号,触发执行类下面的__call__方法. 创建对象时,对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()( ...
- python类的内置方法_python面向对象之类中的内置方法
__setattr__,__delattr__,__getattr__,__getattribute__以及标准类型的二次加工 __setattr__,__delattr__,__getattr__的 ...
- Python面向对象编程:深度认识类class
类中的其他内置函数/属性 前文代码展示了'__init__'函数,这个是类的内置函数,默认不写就没有执行多余操作. 在Python中类这种结构还包含了下面的一些内置函数属性: __name__ 类名字 ...
- 二十六. Python基础(26)--类的内置特殊属性和方法
二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...
- python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解
2019独角兽企业重金招聘Python工程师标准>>> 1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过 ...
- C++类的成员函数(在类外定义成员函数、inline成员函数)
类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...
- C++的成员函数声明与定义 —— 类外定义成员函数以及inline函数
作者原文:https://www.cnblogs.com/wuchanming/p/4061654.html 类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它 ...
最新文章
- 标记三维点_细胞器相互作用过程的高速三维全景成像
- TensorFlow 2.0 极简教程,不到 20 行代码带你入门
- python一只青蛙一次可以_青蛙王子 儿童睡前故事 格林童话
- 20110128 学习记录:Datalist中的item项不自动换行而只用空格隔开
- php函数用竖线隔开,用指定的分隔符号把字符串转换成数组《 PHP 基础 》
- cannot find -lmysqlclient 的解决方案
- 音视频编解码:NVIDIA Jetson Linux Multimedia API(总结)
- python接口自动化 -参数关联(一)
- Could not find com.android.support:appcompat-v7:25.3.1.
- Linux 自定义快捷命令
- C语言 —— 符号(C语言的基本符号)
- linux格式化硬盘fat32,linux格式化硬盘教程 linux格式化硬盘教程是什么
- 软件工程领域权威期刊
- MIT线性代数笔记七 列空间和零空间求解 Ax=0:主变量和特解
- Secondary NameNode:它究竟有什么作用?
- 我的2017,五味杂陈
- 【C#】基础篇(2) C#实现串口助手,C#扫描串口
- Spring核心原理及工作方式
- element Dropdown二级下拉菜单
- 金蝶软件连接显示服务器超时,金蝶连接云服务器超时
热门文章
- diskgenius 数据迁移_活见鬼,明明删除了数据,空间却没减少! - *IT界农民工*
- python find不区分大小写_牛鹭学院:Python基础了解
- 风变的python课程怎么样_风的解释|风的意思|汉典“风”字的基本解释
- 非你莫属 java全球排名_TIOBE:2018年5月全球编程语言排行榜
- c语言josn序列化和反序列化,Flutter 中 JSON 的序列化和反序列化
- 服务器运行容器工具大盘点!
- Spring Boot(十)Logback和Log4j2集成与日志发展史
- 如何在使用ASPMVC4的分部视图中获取数据展示
- YOLO v3 安装并训练自己数据
- Python 代码优化常见技巧