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激励我努力