6.1一切皆对象
6.2属性管理
6.3我是风儿,我是沙
6.4内存管理
6.11运算符
两个对象能否可以运算,关键是看相应的对象是否有运算方法。(可以用dir()来调查对象的属性)
若对象没有定义到运算方法,可用创建一个子类,如:通过_sub_()方法来添加减法方法操作的定义
6.12元素引用
_getitem_(self,key):返回键对应的值。
_setitem_(self,key,value):设置给定键的值
_delitem_(self,key):删除给定键对应的元素。
_len_():返回元素的数量
6.13内置函数的实现
len()--- _len_()
int()--- _int_() 用于将一个字符串或数字转换为整型。
abs()-- _abs_() 返回数字的绝对值。
6.21属性的背后
对象的属性是分层对应的,某个属性可能在不同层被重复定义。
一是优先原则,二是子类的属性比父类的同名属性有优先权。
如果是进行赋值,Python不会分层深入查找。只会搜索对象本身的_dict_()
如果用self引用对象,则也会遵守相同的规则
6.22特性
描述
property() 函数的作用是在新式类中返回属性值。
语法
以下是 property() 方法的语法:
class property([fget[, fset[, fdel[, doc]]]])
参数
fget -- 获取属性值的函数
fset -- 设置属性值的函数
fdel -- 删除属性值函数
doc -- 属性描述信息
6.23_getattr_方法
描述
getattr() 函数用于返回一个对象属性值。
语法
getattr(object, name[, default])
参数
object -- 对象。
name -- 字符串,对象属性。
default -- 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。
代码:第六章 - 代码片段 - 码云 Gitee.com
6.31动态类型
定义:在赋值时,变量可以重新赋值为其他任意值。对象名是指向这一对象的引用。每次赋值时, 我们让左侧的引用指向右侧的对象。
通过内置函数id(),我们能查看到引用指向的是哪个对象。这个函数能返回对象的编号。
a=1
print(id(1))
print(id(a))
还可以用is运算来判断两个引用是否指向同一个对象。
a=3
b=3
print(a is b)
6.32 可变与不可变对象
可变对象:在操作列表时,如果通过元素引用改变了某个元素,那么对象自身会发生改变。
不可变对象:赋值最多只能改变引用的指向,不能改变整型、浮点型、字符串型和元组等对象。
6.33 从动态类型看函数的参数传递
若传递的是不可变对象,则参数不影响外部变量。
若传递的是可变对象,会影响到其他的引用。
6.41 引用管理
引用计数:一个对象可以有多个引用,而每个对象中都存在指向该对象的引用总数。
6.42对象引用对象
globals() 函数会以字典类型返回当前位置的全部全局变量。
del:删除某个引用或容器中的元素。
6.43 垃圾回收
定义:
原理上,当Python的某个对象的引用计数降为0,即没有任何引用指向该对象时,该对象就成为要被回收的垃圾了。
条件:当Python运行时,会记录其中分配对象(Object Allocation)和取消分配对象 (Object Deallocation)的次数。当两者的差值高于某个阈值时,垃圾回收才会启动。
分代:
定义:Python将所有的对象分为0、1、2三代。所有的新建对象都是0代对象。当某一 代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象。垃圾回收启动 时,一定会扫描所有的0代对象。如果0代经过一定次数垃圾回收,那么就启动对0代 和1代的扫描清理。当1代也经历了一定次数的垃圾回收后,就会启动对0、1、2代的扫描,即对所有对象进行扫描。
6.44 孤立的引用环
创建两个表对象,并引用对方,构成一个引用环。
回收:Python会遍历所有的对象i。对于每个对象i所引用的对象j,将对象j的gc_ref_ij减1。
在结束遍历后,gc-ref_j不为0的对象,和这些对象引用的对象,以及继续更下游引用的对象,需要被保留,而其他对象则被垃圾回收。
。