Python开发(人工智能/大数据/机器学习)Python查漏补缺

【查漏补缺】Python单例、异常和模块81~100

2019-03-03  本文已影响26人  TensorFlow开发者

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.在导入模块文件时,被导入的模块中所有可以被直接执行的代码都会被执行一遍,这一点要特别注意。

上一篇下一篇

猜你喜欢

热点阅读