对象池
小整数池
系统默认创建好的,等着你使用。使用的每一个小整数,都是同一个
整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。Python 对小整数的定义是 [-5, 256],这些整数对象是提前建立好的,不会被垃圾回收。在一个 Python 的程序中,无论这个整数处于LEGB(局部变量,闭包,全局,内建模块)中的哪个位置,所有位于这个范围内的整数使用的都是同一个对象。
注意在测试的时候不能用IDE,要用终端,IDE经过特殊处理了,不是原生的。pycharm每次都是所有代码都加载到内存中,被看成是一个整体
发现删除a后,b的地址依旧是删除之前的那个地址(是否删除,小整数都常驻内存)
大整数池默认创建出来,池内为空的,创建一个就会往池中存储一个
创建一个,从内存中申请一个,装到大整数池里面。再需要用到下一个,再创建一个.......
intern机制(对于字符串来说)
每个单词(字符串),不夹杂空格或者特殊符号,默认开启intern机制,共享内存,靠引用计数决定是否销毁
相同的字符串默认只保留一份,当你创建一个字符串,它会先看一下内存里有没有这个字符串,如果有就不再创建新的了
判断两个变量是不是同一个
- ①id
- ②is
如果含有特殊字符
内建属性
内建模块中的东西都不用手动引入
例如
- __dict__ 类的属性(包含一个字典,由类的数据属性组成)
- __doc__ 类的文档字符串
- __name__ 类名
- __module__ 类定义所在的模块
- __bases__ 类的所有父类构成元素(包含了以个由所有父类组成的元组)
这些函数可以直接使用
list1 = [] print(list1.__doc__)
实际上打印的是注释中的内容
多行注释又叫文本注释
class Student(): """ 文档注释: Student(name,age) """ def __init__(self,name,age): self.name = name self.age = age stu = Student('学生',18) print(stu.__doc__)
属性拦截器
可以对类里加一些操作,对某些属性的获取值时进行拦截
class Student(): def __init__(self,name,age): self.name = name self.age = age #属性拦截器 def __getattribute__(self,item): if item == 'name': #如果要获取name,返回‘123’ return '123' stu = Student('学生',18) print(stu.name)