内置方法(二)--定制类相关

本文深入探讨Python中的高级特性,包括对象类型检查、属性管理、定制对象显示、内存管理等,并介绍了__slots__用于节省内存空间的方法。

1>isinstance(obj, cls) 和 issubclass(sub, super)

    isinstance(obj,cls)检查是否obj是否是类 cls 的对象

    issubclass(sub, super)检查sub类是否是 super 类的派生类

2>查看属性、设置属性、删除属性的 __getitem__, __setitem__, __delitem__

    

    既然增删改查都会自动调取,那么写入真正的增删改查方法,是否就确实实现了这些功能呢? 答案是:是的

    因本质上还是对对象的字典进行操作,所以代码改成了如下

    

    


3>改变对象的字符串显示  __str__

    python中类型和类是一个概念,我用list类实例出一个对象l1,再写一个类A,实力出对象a,再打印这两个对象

    为何一个显示数据,一个显示对象内存地址啥的,如下:

    

    因为list方法在你print的时候,对数据展示做了转换,也就是执行print方法时会自动调用的一个内置方法 __str__

    稍加改动,如下

    

    主要注意的2点:1、__str__方法一定要有返回数据;2、返回的数据只能是str类型

    

    

4>当对象在内存中被释放是,自动触发执行的  __del__

    从文件读写开始吧,先分析下python中读取文件,究竟是做了些啥

    

    综上,那么这些“残留”python应用内存中的对象(如f1),该怎么关闭呢?一定要等到程序关闭才会关闭吗

    __del__方法便是处理这些问题的方法,程序在结束之前会自动调用__del__方法

    如下例子,模拟文件操作写一个Open类,加入__del__方法,效果如下

    

    如果程序没执行完,中途手动删除对象呢?---那就是直接调该方法,程序结束不再自动执行。

    

    所以, 这个__del__方法可以写入很多功能,如:触发操作系统关闭文件资源的命令(回收操作系统的资源),这也是之前

    文件操作一直提醒的,操作完文件要close()一样,不然这边程序是结束了,但是操作系统还打开着呢;删除自身残留对象等等

    

    典型的应用场景:

    创建数据库类,用该类实例化出数据库链接对象,对象本身是存放于用户空间内存中,而链接则是由操作系统管理的,

    存放于内核空间内存中,当程序结束时,python只会回收自己的内存空间,即用户态内存,而操作系统的资源则没有

    被回收,这就需要我们定制__del__,在对象被删除前向操作系统发起关闭数据库链接的系统调用,回收资源这与文件

    处理是一个道理

5>__module__ 和 __class__

    __module__ 表示当前操作的对象在那个模块

    __class__ 表示当前操作的对象的类是什么

    

6> __doc__, 类的描述信息,该属性无法被继承

    

7> __slots__

    1.__slots__是什么:是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个

    数据属性,而不再是之前的dict类的键值对)

    2.使用点来访问属性本质就是在访问类或者对象的__dict__属性字典(类的字典是共享的,而每个实例的是独立的),字典会占

    用大量内存,如果你有一个属性很少的类,但是有很多实例,为了节省内存可以使用__slots__取代实例的__dict__。

    3.当你定义__slots__后,__slots__就会为实例使用一种更加紧凑的内部表示。实例通过一个很小的固定大小的数组来构建,

    而不是为每个实例定义一个字典,这跟元组或列表很类似,缺点也显而易见,不能再给实例添加新的属性了,

    只能使用在__slots__中定义的那些属性名。

    

    综上:__slots__引用场景:当你需要一个属性比较少的类,但是却需要实例化出很多对象的时候,这个时候可以考虑引入

    __slots,可以节省很多内存空间。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值