【查漏补缺】Python单例、异常和模块81~100
81.类方法定义的注意点有二:一,类方法定义必须用装饰器@classmethod
来修饰,来告诉解释器这是一个类方法。二,类方法第一个参数必须是cls,以便在类方法内部可以访问类的其他类属性或类方法。
说明:在装饰器@classmethod
的基础上,开发工具通常会自动为开发者补齐cls参数。
82.静态方法:当一个方法不需要访问实例属性也不访问类属性时,则可以把该方法定义成静态方法。
83.静态方法:定义有2点要注意:一,静态方法定义必须用装饰器@staticmethod
来修饰,来告诉解释器这是一个静态方法。二,静态方法第一个参数不再是self、cls,因为在静态方法内部不需要再访问类属性或实例属性。
84.__new__( )
是object内置的一个静态方法。该方法会为对象分配内存空间,并返回对象的引用。Python解释器拿到对象的引用,将引用作为第一个参数传递给__init__()
方法。
85.__new__( )
在创建对象时,会自动被调用。如果重写该方法,一定记得调用并返回分配的引用super().__new__(cls)
。否则,创建的对象既没有内存地址,更没有初始化。
86.单例:
class Abc(object):
# 用来记录第一个被创建对象的引用
instance = None
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
87.Python单例设计优化:我们无法控制系统调用初始化方法,但可以添加一个类属性,控制初始化方法中的初始化动作。
88.异常:else:只有在没有捕捉到异常时才会调用。finally:不管有没有捕捉到异常,都会调用。
try:
except AaaError:
except (BbbError, CccError):
except Except as result:
else:
finally:
89.异常的传递,当函数/方法的执行过程中出现了异常,会先将异常传递给函数/方法的调用一方。如果层层传递,传到主程序,仍然没有处理异常,则此时程序会终止。
90.基于异常的传递,我们可以在主函数增加异常捕捉。
91.抛出异常:先创建一个Except("异常描述说明")类的对象,然后raise抛出异常即可。
92.尽管可以一次性导入多个模块,模块名之间用逗号分割即可,但不推荐这么干。
推荐的做法:在导入模块时,每个导入应该独占一行。
93.可以在导入模块的同时,给模块起一个别名,别名推荐使用大驼峰命名法。使用时,要加上:模块名.或者别名.。
import xxxxx as XxxYyy
94.from xxx import yyy
从xxx模块导入部分的变量、类、函数等,就可以用这种方式导入。用from导入后,可以直接使用。
95.如果从两个不同的模块中导入了相同的函数,则后导入的函数会覆盖先导入的同名函数。
一旦发现有冲突,可以给导入的起个别名即可解决。
96.from xxx import *
同样可以一次性导入xxx模块中的所有内容,且使用时不需要加模块名.,但不推荐此导入方式,因为出现导入冲突时,很难排查。
97.模块的查找顺序:会优先在当前工作目录下去查找要导入的模块,找不到再去找系统目录下提供的模块。
98.Python中每一个模块都有一个内置属性__file__
,可以查看模块的完整路径。
99.每一个独立的py文件都是一个模块。
100.在导入模块文件时,被导入的模块中所有可以被直接执行的代码都会被执行一遍,这一点要特别注意。