Python学习(七)


博文中图片引用字b站Python学习系列教程,侵删。

一、单例

1、单例设计模式

定义设计模式是前人工作的总结和提炼,被人们广泛流传的设计模式都是针对某一特定问题的成熟解决方法。使用设计,欧式是为了可重用代码。
单例设计模式:让类创建的对象,在系统中只有唯一一个实例,也就是说每一次执行类名()返回的对象,内存地址是相同的。也就相当于同时只能有一个。

2、单例设计模式实现关键——__new__方法

过程
在使用类名()创建对象的时候,会自动调用__init__进行初始化,单其实在__init__方法之前,还会调用__new__方法。该方法是一个静态的方法(所以在我们需要设计到类的属性或者方法的时候,需要将类的引用当做参数传递),其作用是:
(1)、在内存中为对象分配空间
(2)、返回对象的引用
**Python的解释器获得对象的引用之后,会将引用作为第一个参数传递给__init__函数。

__new__方法重写:__new__方法重写十分固定:
(1)、一定要return super().new(cls),这就是为对象分配空间
(2)、__new__是一个静态方法,在调用是需要主动传递cls参数

3、单例

让类创建的对象在系统中只有一个唯一的实例:

class MediaPlayer(object):
    #增加类属性保存该唯一对象
    instance = None
    def __new__(cls):
    	#因为这里是cls,就是指向类的,所以访问类属性的时候可以直接用cls
        if cls.instance is None:
            #注意这里要赋值的,要将返回的引用返回
            cls.instance = super().__new__(cls)
        return  cls.instance 
    def __init__(self):
        print("创建一个实例")

p1 = MediaPlayer()
p2 = MediaPlayer()
print(p1)
print(p2)

4、只执行一次初始化工作

需求:只让初始化动作执行一次:

class MediaPlayer(object):
    #增加类属性保存该唯一对象
    instance = None

    #增加一个类属性标志来判断是否执行过
    init_flag = False

    def __new__(cls):
        if cls.instance is None:
            #注意这里要赋值的,要将返回的引用返回
            cls.instance = super().__new__(cls)
        return  cls.instance 

    def __init__(self):
        #这里访问类属性,因为没有cls,所以我们只用类名进行使用
        if MediaPlayer.init_flag==False:
            print("执行初始化动作")
            #执行改变标志
            MediaPlayer.init_flag = True

p1 = MediaPlayer()
p2 = MediaPlayer()
print(p1)
print(p2)

二、捕获异常

1、异常处理基本语法

异常处理的目的是为了不让程序终止,这在实际的应用是非常重要的。

try:
    num = int(input("请输入一个整数:"))
    result = 8/num
    print(result)
except ZeroDivisionError:
    print("除零错误")
except ValueError:
    print("请输入数字")
#不知道异常的具体类型
except Exception as error:
    print("发生错误%s"%error)

#不发生异常在执行
else:
    print("你输入的是数字,并且没有发生异常")

#不管异常不异常都执行
finally:
    print("你已经进行了一次输入")

2、异常的传递

在函数中发生的异常,会将异常抛给调用者,如果在调用者中没有处理异常,那么就会终止程序。

def demo1():
    return int(input("请输入一个数字:"))

def demo2():
    return demo1()

print(demo2())

在主程序中调用demo2,之后又会调用demo1。如果demo1发生异常,会将错误抛给demo2,demo2没有处理就会继续将异常抛给main函数,都没有处理就会终止程序。

3、抛出异常

步骤
(1)、使用Exception类生成异常对象
(2)、使用raise关键字抛出异常

#对密码长度进行限制
def input_pswd():
    pswd = input("请输入密码:")
    cnt = len(pswd)
    if cnt<8:
        #创建异常对象并且抛出异常
        ex = Exception("密码长度不够")
        raise(ex)
    else:
        return pswd

try:
    print(input_pswd())
except Exception as error
    print(error)

三、使用模块

1、基本语法

所有的Python源程序都可以使用import作为模块进行导入,通过模块名.使用模块提供的工具:全局变量、函数、类

import name(不需要加上文件的.py后缀)

使用as指定模块的别名:如果模块的名字太长,可以使用as指定模块的名称,以方便在代码中使用:

import 模块名1 as 别名
模块别名应该符合大驼峰命名法

from……import导入:导入模块中的部分,可以直接使用,不用通过模块名访问:

from 模块名 import 工具名
不需要通过模块名.
可以直接使用模块提供的工具——全局变量、函数、类

注意:如果两个模块存在同名的函数,那么后导入模块的函数,会覆盖先导入的模块的函数。
from……import*:可以直接访问模块中所有的方法、类、全局变量,不需要使用模块名。

2、模块的搜索顺序

Python的解释器在导入模块时,会:
(1)、搜索当前目录的指定模块名的文件,如果有就直接导入
(2)、如果没有,再搜索系统目录
所以,在给模块文件起名的时候不要和系统模块文件重名
Python中每一个模块都有一个内置属性__file__可以查看模块的完整路径。

3、模块导入原则(如何屏蔽模块中的测试语句)

Python在导入文件的时候,文件中所有没有任何缩进的代码都会被执行一遍,但是很多时候这些是测试代码,并不希望被执行。

__name__属性:该属性是Python的一个内置属性,记录一个字符串:
(1)、如果是被其他文件导入,__name__就是模块名
(2)、如果是当前执行的程序,__name__就是__main__

#模板文件module.py
def say_hello():
    print("hello")
if __name__=="__main__":
    print("这是一个模板")
    say_hello()

#主文件
import module
module.say_hello()

#这样在主文件中module的测试代码就不会执行

常见的模块中的测试代码的写法

#导入模块
#定义全局变量
#定义类
#定义函数

#在代码的最下方
def main():
    #……
    pass

#根据__name__判断是否执行下方的代码
if __name__ =="__main__":
    main()

4、包

包就是包含多个模板的目录,但是其必须含有一个特殊的文件__init_|_.py,该文件中包含了包中的所有模块的列表:

#导入包的方式
import 报名
#特殊文件的内容
from . import module1
form . import module2

5、发布分享自己开发的模块

在这里插入图片描述在这里插入图片描述

6、pip安装第三方模块

在这里插入图片描述

四、文件

1、文件的基本操作

文件操作的一般步骤
(1)、打开文件(open(文件名,打开方式))
(2)、操作(read(),write(),readline())
(3)、关闭文件(close)
open函数负责打开文件,如果文件存在返回文件对象,否则报错。
read/write/close三个方法都需要通过文件对象调用。
每次read调用之后,文件指针会移到文件的末尾。

打开文件的方式

f = open(“name”,“methos”)

在这里插入图片描述

2、文件编码方式

ASCII编码
使用一个字节代表一个字符,因此也就只有256个字符
UTF-8:计算机中使用1到6个字节来表示一个utf-8字符,大多数汉字会使用3个字节表示。UTF-8是UNICODE编码的一种编码格式。

Python2中使用的是ASCII编码,Python3中使用的是utf-8编码,所以当使用Python2的时候需要在源码的开头写上:

#*-*coding:utf-8*-*(官方推荐,星减星)
or
# coding=utf-8
除此之外,如果字符串要遍历每个字符,那么还要再字符串的引号前增加一个小写字母u,否则python2解释器还是会报错

3、eval()函数

作用:该函数会将字符串当成有效的表达式来求值并返回计算结果,例如:
在这里插入图片描述
作用
在input的时候尽量避免直接使用eval(),因为这很危险,如果用户输入的是系统操作,那么就会造成危险,例如:
在这里插入图片描述
这里导入了os模块,那么就可以进行系统操作,就会导致危险。

ggdd激励我努力
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值