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——面向对象进阶二:类的内置函数补充、描述符...相关推荐

  1. python类装饰器应用_python之描述符应用与类的装饰器

    一.描述符应用 1.1上下文管理协议 在上文中我们提到with语句中的上下文管理器.with语句可以如此简单但强大,主要依赖于上下文管理器.那么什么是上下文管理器?上下文管理器就是实现了上下文协议的类 ...

  2. matlab二维图形函数,在MATLAB中,画二维图形的常用函数为( )。

    [单选题]( )至今仍未走出困境,美欧与俄罗斯由此而展开的战略博弈也仍在持续. [多选题]信号跟踪的主要目的有: [判断题]You have the power to develop the sale ...

  3. Python之路(第二十七篇) 面向对象进阶:内置方法、描述符

    一.__call__ 对象后面加括号,触发执行类下面的__call__方法. 创建对象时,对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()( ...

  4. python类的内置方法_python面向对象之类中的内置方法

    __setattr__,__delattr__,__getattr__,__getattribute__以及标准类型的二次加工 __setattr__,__delattr__,__getattr__的 ...

  5. Python面向对象编程:深度认识类class

    类中的其他内置函数/属性 前文代码展示了'__init__'函数,这个是类的内置函数,默认不写就没有执行多余操作. 在Python中类这种结构还包含了下面的一些内置函数属性: __name__ 类名字 ...

  6. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  7. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过 ...

  8. C++类的成员函数(在类外定义成员函数、inline成员函数)

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...

  9. C++的成员函数声明与定义 —— 类外定义成员函数以及inline函数

    作者原文:https://www.cnblogs.com/wuchanming/p/4061654.html 类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它 ...

最新文章

  1. 标记三维点_细胞器相互作用过程的高速三维全景成像
  2. TensorFlow 2.0 极简教程,不到 20 行代码带你入门
  3. python一只青蛙一次可以_青蛙王子 儿童睡前故事 格林童话
  4. 20110128 学习记录:Datalist中的item项不自动换行而只用空格隔开
  5. php函数用竖线隔开,用指定的分隔符号把字符串转换成数组《 PHP 基础 》
  6. cannot find -lmysqlclient 的解决方案
  7. 音视频编解码:NVIDIA Jetson Linux Multimedia API(总结)
  8. python接口自动化 -参数关联(一)
  9. Could not find com.android.support:appcompat-v7:25.3.1.
  10. Linux 自定义快捷命令
  11. C语言 —— 符号(C语言的基本符号)
  12. linux格式化硬盘fat32,linux格式化硬盘教程 linux格式化硬盘教程是什么
  13. 软件工程领域权威期刊
  14. MIT线性代数笔记七 列空间和零空间求解 Ax=0:主变量和特解
  15. Secondary NameNode:它究竟有什么作用?
  16. 我的2017,五味杂陈
  17. 【C#】基础篇(2) C#实现串口助手,C#扫描串口
  18. Spring核心原理及工作方式
  19. element Dropdown二级下拉菜单
  20. 金蝶软件连接显示服务器超时,金蝶连接云服务器超时

热门文章

  1. diskgenius 数据迁移_活见鬼,明明删除了数据,空间却没减少! - *IT界农民工*
  2. python find不区分大小写_牛鹭学院:Python基础了解
  3. 风变的python课程怎么样_风的解释|风的意思|汉典“风”字的基本解释
  4. 非你莫属 java全球排名_TIOBE:2018年5月全球编程语言排行榜
  5. c语言josn序列化和反序列化,Flutter 中 JSON 的序列化和反序列化
  6. 服务器运行容器工具大盘点!
  7. Spring Boot(十)Logback和Log4j2集成与日志发展史
  8. 如何在使用ASPMVC4的分部视图中获取数据展示
  9. YOLO v3 安装并训练自己数据
  10. Python 代码优化常见技巧