python之单例、异常、模块、包和文件

单例

__new__()方法
    使用 类名() 创建对象时,Python 的解释器 首先 会 调用 __new__ 方法为对象 分配空间
    __new__ 是一个 由 object 基类提供的 内置的静态方法,主要作用有两个:
        1) 在内存中为对象 分配空间
        2) 返回 对象的引用
    Python 的解释器获得对象的 引用 后,将引用作为 第一个参数,传递给 __init__ 方法
    重写 __new__ 方法 一定要 return super().__new__(cls)
    否则 Python 的解释器 得不到 分配了空间的 对象引用,就不会调用对象的初始化方法
    注意:__new__ 是一个静态方法,在调用时需要 主动传递 cls 参数
    __new__()方法的代码:
class MusicPlayer(object):
    def __new__(cls, *args, **kwargs):
        # 如果不返回任何结果,
        return super().__new__(cls)
    def __init__(self):
        print("初始化音乐播放对象")
player = MusicPlayer()
print(player)

单例设计模式:
    让类创建的对象在系统中只有一个唯一的实例
    每一次执行 类名() 返回的对象,内存地址是相同的
单例过程分析:
    定义一个 类属性,初始值是 None,用于记录 单例对象的引用
    重写 __new__ 方法
    如果 类属性 is None,调用父类方法分配空间,并在类属性中记录结果
    返回 类属性 中记录的 对象引用
class MusicPlayer(object):
    # 记录第一个被创建对象的引用
    instance = None
    # 记录是否执行过初始化动作
    init_flag = False
    def __new__(cls, *args, **kwargs):
        # 1. 判断类属性是否是空对象
        if cls.instance is None:
            # 2. 调用父类的方法,为第一个对象分配空间
            cls.instance = super().__new__(cls)
        # 3. 返回类属性保存的对象引用
        return cls.instance
    def __init__(self):
        if not MusicPlayer.init_flag:
            print("初始化音乐播放器")
            MusicPlayer.init_flag = True
# 创建多个对象
player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)

****************************************************************************************************************************
****************************************************************************************************************************

异常

异常:程序停止执行并且提示错误信息的动作,我们通常称之为抛出异常(raise)
异常的传递,继承的传递
Python 中提供了一个 Exception 异常类
在开发时,如果满足 特定业务需求时,希望 抛出异常,可以:
创建 一个 Exception 的 对象
使用 raise 关键字 抛出 异常对象
def input_password():

    # 1. 提示用户输入密码
    pwd = input("请输入密码:")

    # 2. 判断密码长度,如果长度 >= 8,返回用户输入的密码
    if len(pwd) >= 8:
        return pwd

    # 3. 密码长度不够,需要抛出异常
    # 1> 创建异常对象 - 使用异常的错误信息字符串作为参数
    ex = Exception("密码长度不够")

    # 2> 抛出异常对象
    raise ex


try:
    user_pwd = input_password()
    print(user_pwd)
except Exception as result:
    print("发现错误:%s" % result)
抛出异常
def fun():
    1.创建异常对象
    ex=Exception("定义错误信息")
    2.抛出异常
    raise ex

出问题了,不一定需要打印,raise会把错误的信息抛出到了控制台
except Exception as result:  # 这里捕获未知的系统捕获的异常,然后打印
    print(result)

****************************************************************************************************************************
****************************************************************************************************************************

模块

python模块名也是标识符
导入     import 模块1,模块2
         import 模块1
         import 模块2

模块名.类名
1.模块
    导入模块的方式:
    方式1:.
        import 模块名
        模块名.函数名()
        对象=模块名.类名()
        模块名.全局变量
    方式2:as
        import 模块名 as 别名
        别名.全局变量
        别名.函数名()
        对象=别名.类名()

    方式3:from
        from 模块名 import 变量/函数/类
        全局变量/类/函数
        从不同模块中导入同名的,就使用后面导入的,后面的覆盖了前面的
        通过as取不同的别名
        from 包 import 模块名
        form bao.model import 变量/函数/类

    当两个模块名重复,可以用别名
    模块起别名
        import 模块名 as 模块别名(大驼峰)
    模块导入和导入模块中所有名称是有区别的,一个要用模块名.,一个直接用
    如果导入的模块过多,不建议导入模块中的所有,因为模块中的函数名/类名/全局变量名可能重复
2.模块的调用顺序
print(模块名.__file__)  # 查看模块的完整路径
搜索顺序:先找当前文件夹,再找系统的

3.导入模块时,会先执行模块文件,把模块中的代码写入
模块可以提供全局变量/函数/类。直接执行的代码不是外界提供的工具。
文件中没有任何缩进的代码都会被执行一遍
__name__是python的一个内置属性,记录着一个字符串;记录的是文件的名称;默认是"__main__"
__name__内置属性,是字符串,是可变的,默认是__main__。是本文件打印,就是__main__,是其他文件导入模块,打印就是文件名
*************
if __name__=="__main__":
    main()
效果:可执行语句只在本文件中运行,当这个文件被当作模块导入其他文件的时候,这些代码不会执行
把执行语句写在def main():中,然后加上上面的语句
                            # 导入模块
                            # 定义全局变量
                            # 定义类
                            # 定义函数
                            # 在代码的最下方
                            def main():
                                pass
                            # 根据 __name__ 判断是否执行下方代码
                            if __name__ == "__main__":
                                main()

****************************************************************************************************************************
****************************************************************************************************************************

包是一个包含多个模块的特殊目录;目录下有一个特殊文件__init__.py;包名 小写字母_
包的建立
    1.新建包:
        new--->python package 自动产生一个__init__.py文件
    2.导包
        1.包外面的文件:import 包名
        2.在__init__.py:导入想被外界使用的模块
            from . import 模块名
        3.在外界使用这个模块
    3.发布模块
        安装pygame:pip install pygame
        卸载pygame:uninstall pygame
        安装ipython: pip install ipython
        卸载pygame:pip uninstall ipython

****************************************************************************************************************************
****************************************************************************************************************************

文件

文件:永久存储数据的
cpu读取文件内容,文件先从硬盘加载到内存中,因为内存速度快
文本文件  txt,代码文件,可以使用文本编辑器查看的
word文档,图片,视频都是二进制文件。保存的内容不能直接使用文本编辑器查看,而是使用其他软件打开的
文件的作用:将数据长期保存下来。文本文件本质上还是二进制文件。

文件的基本操作
    1.打开文件
    2.读写文件
        读:将文件内容加载进内存
        写:将内存内容写入文件
    3.关闭文件

    操作文件的函数/方法open(函数)/read/write/close  1个函数,三个方法
    对象=open()函数负责打开文件,并写入文件对象。其他三个方法要对象才能调用
    对象.read()       read()属于open类
    对象.write()       write()属于open类
    对象.close()       close()属于open类
    注意:文件名区分大小写

    read方法——读取文件
        read方法可以一次性读入

    文件的打开方式(读取)
        1.创建文件对象
            file=open(文件路径)  # 需要操作的文件必须和代码源文件平级
            FileNotFoundError:No such file or directory:'README'
        2.读内容了
            text=file.read()
        3.打印文件
-----------------------
文件指针标记从那个位置开始读取数据;开始时,在文件开头;用一次就会移动到文件的末尾

打开文件的方式


注意点:
    1.需要操作的文件必须和代码源文件保持平级
    2.有后缀必须加上后缀
    3.utf-8
# -*- coding: utf-8 -*-     # r
file=open("readme","a")     # w只写入,会覆盖;文件不存在就创建
                            # a追加的方式;文件不存在就创建
file.write("hello123")
file.close()
# 同级,中文问题

 

阅读更多

扫码向博主提问

玩蛇皮

非学,无以致疑;非问,无以广识
去开通我的Chat快问

没有更多推荐了,返回首页