携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
1.对象的销毁
加引用计数
在 Python 中,当一个对象被创建时,就自动地创建了一个引用计数器。当引用计数加1时,增加对这个对象的引用,引用计数器也依次增加。
象的引用计数在下列情况下增加:
- 对象被创建时;
- 创建了另一个别名时;
- 被作为参数传递给函数时;
- 成为容器对象的一个元素时。
少引用计数
当别名被重新赋值时,源对象的引用计数减1。
对象的引用计数在下列情况下减少:
- 一个本地引用离开了其作用范围时,比如函数结束;
- 对象别名被销毁时;
- 对象本身被销毁时。
对象销毁
当对象的引用计数变为0时,它被垃圾回收。Python 中的垃圾回收机制可以处理两种情况,一种是引用为0,另一种是循环引用。循环引用是指两个对象互相引用,且都没有外部的对象对它们进行引用。
2.类的内建函数
issubclass()
issubclass()是一个布尔函数,这个函数用来判断一个类是否是另外一个类的子类或者子孙类。如果给出的子类确实是给出的父类的子类,则返回True,否则返回False。它的语法如下:
issubclass(subclass, parentclass)
parentclass也可以是一个包含若干个父类的元组,只要子类属于元组中某一个父类,则返回True,否则返回False。
isinstance()
isinstance()是一个布尔函数,这个函数用来判断一个对象是否是给定类的实例。若是给定类的实例或是给定类的子类的实例,则返回True,否则返回False。它的语法如下:
isinstance(object,class)
hasattr()、getattr()、setattr()、delattr()
这几个函数可以在各种对象下工作,不限于类和实例。
- (1)
hasattr();hasattr()是布尔型的,它用于判断一个对象是否有一个特定的属性,一般用于在调用某个属性前检查属性是否存在。 - (2)
getattr()、setattr();getattr()是用来获取对象的属性或者方法。若返回的是对象,则返回对象的值,若返回的是对象的方法,则返回方法的内存地址。setattr()是用来给对象的属性赋值。若属性不存在,就先创建属性然后再赋值。 -
(3) `delattr()`。 `delattr()`是用来从一个对象中删除属性。
dir()
- 作用在实例上时,显示实例变量、实例所在的类、基类中定义的方法和属性;
- 作用在类上时,显示类与它的基类的
__dict__内容; - 作用在模块上时,显示此模块的
__dict__内容; - dir()`不带参数时,显示调用者的局部变量。
super()
super()函数的作用就是找出相应的类的父类,然后调用父类的方法与属性。
3.相关知识:
双下划线
在 Python 中,可以在属性或方法前添加双下划线将其变为私有。在这种方法下,要调用私有属性就在名字前加上单下划线和类名。利用这种调用方法,就可以很好地避免当子类变量名与父类变量名相同时覆盖父类的变量。
单下划线
在一个模块中以单下划线开头的变量和函数被默认当做内部函数。当我们使用from module import *来导入模块时,这些不会被导入。但如果使用import module来导入整个模块,这部分还是会被导入,那么就可以用module.var来访问。
包装
包装就是对已存在对象的属性功能进行调整,删除不需要的、添加或是修改已存在的功能,以达到自己所理想的规格,并装换成另外一种更适合当前使用场合的对外接口。包装包括定义一个类,它的实例拥有标准类型的核心行为。
授权
授权是包装的一个特性,采用已存在的功能达到最大限度的代码重用。在包装中我们可以新建、修改或删除已有的功能,授权的过程就是将更新的功能交由新类来处理,已存在的功能就授权给对象的默认属性。