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,可以节省很多内存空间。