第六章 与对象的深入交往

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的对象,和这些对象引用的对象,以及继续更下游引用的对象,需要被保留,而其他对象则被垃圾回收。

你可能感兴趣的:(第六章 与对象的深入交往)