Python语法 43——49





1. 单例

2. 异常

3. 模块

4. 包

5. 发布模块

6. 文件操作

7. 字符编码格式




1. 单例是一种设计模式


应用场景:

① 整个系统只有一个回收站,所有位置删除的垃圾,最终都在这一个回收站里;

② 音乐播放器,同时只能播放一首歌;

③ 人物养成游戏里,同一个角色打打杀杀升级交易,只对这一个角色有效。


目的:

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


__new__ 方法:

__new__方法是为了配合实现单例模式,通过重写__new__方法来实现单例模式。创建对象时,__new__方法会被自动调用,因为__new__方法主要作用就是分配空间

happysneaker.com


__new__方法只是分配空间,而且是object类的一个方法。

happysneaker.com

happysneaker.com


#其实单例的核心就是让生成的对象永远只是那么一个,即内存地址就是那一个,是不变的,如下研究:

happysneaker.comhappysneaker.com


单例模式两大步骤,分别针对 __new__ 和 __init__ 方法:

一、针对 __new__ 只分配一个内存空间

① 定义类属性 instance=None

② 在__init__方法中判断 instance 是否为空

③ 为空的话, 给instance赋值 super().__new__(cls) , 不为空的话直接返回 cls.instance

happysneaker.comhappysneaker.com

所以要明白,每次实例化一个对象的时候,都是有两个系统自动完成的方法:

happysneaker.com


二、只初始化一次

happysneaker.com

所以完整单例模式代码为:

class MusicPlayer(object):
	#类属性一,记录第一个被创建的对象的引用
	instance = None

	#类属性二,记录是否执行过初始化方法
	init_flag = False

	def __new__(cls,*args,**kwargs):
		if cls.instance is None:
			cls.instance = super().__new__(cls)
		return cls.instance
	def __init__(self):
		#如果执行过初始化方法,直接返回
		if MusicPlayer.init_flag:
			return
		#如果没执行过,执行初始化动作
		print("这里是初始化动作")

		#将标记设为执行过了
		MusicPlayer.init_flag = True

player1 = MusicPlayer()
print(player1)
player2 = MusicPlayer()
print(player2)





2. 异常

遇到错误,就会抛出异常。所以我们需要针对异常作出相应的处理。

捕获异常代码,不能确定的代码放在try,然后紧跟except,如果try的代码出现异常,执行对应的处理代码。开发时候需要考虑到多种可能出现的异常,所以也要编写对应的异常捕获处理代码。 而python解释器抛出异常的最后一行的第一个单词,就是异常类型。

happysneaker.com

多种错误类型,依次增加即可。当然我们不可能预测出全部的错误类型,真实环境下有各种未知错误,因此需要对未知异常进行设置,使得程序不会崩溃,最后加如下代码即可,格式固定

except Exception as result:

       print("未知错误 %s" %result)

happysneaker.com


所有异常捕获代码:

happysneaker.com




扩展:

开发的时候不可能针对每个函数进行异常捕获代码编写,因此需要用到异常的传递性,将所有异常抛给主程序处理即可。方法就是,你的函数正常写,然后主程序中增加异常捕获代码即可:

happysneaker.com


当然还得针对某些特殊场景,主动抛出异常,比如用户名、密码规则等等:

happysneaker.com


使用方法:

ex = Exception("具体异常原因情况说明")

raise ex


然后在 except Exception as result: 里写:

print result

happysneaker.com

happysneaker.com

happysneaker.com




3. 模块

happysneaker.comhappysneaker.com


当然如果导入的模块名特别复杂或者想改一下,也是可以的:import aaa as b ,即可

happysneaker.com



import是全部导入所有工具,也可以部分导入 : from xxx import tool,这样的话就可以直接使用工具了,不再需要用模块名.的方式来使用。

happysneaker.com

happysneaker.com


肯定会有从两个不同模块导入相同名称函数的情况,所以可以对其中一个函数名进行修改,注意改的是函数名了:

happysneaker.com


还有一种导入模块的方式,导入后不用 模块ming. de 方式进行工具调用,但是不推荐使用,因为模块一多,就难排错,知道即可,会被老板打屎的。

happysneaker.com


注意注意,这里出现了一个问题!!!!!!!!任何模块被导入时,被导入模块中所有未缩进的代码行就会被执行一遍,可是我们不想让它执行,怎么办?????这里就用到了重重重重重要的__name__属性,这是个属性:

happysneaker.com

一般网络上我们用到别人写的包的时候,会经常遇到。




4. 包-package

包就是一个特殊的目录,包含多个模块,但一定有一个__init__.py这个模块,命名方式数字小写字母下划线,字母开头。

happysneaker.com




5. 发布模块(重要重要)

如果自己制作的模块想让别人知道,分享给别人:

happysneaker.com

happysneaker.com


PIP 第三方安装工具安装第三方模块:

happysneaker.com





6. 文件,对文件进行操作

操作文件永远是三个步骤:① 打开 ② 读写 ③ 关闭

happysneaker.comhappysneaker.com


文件指针,用来标记read()方法读到哪里了,一般read()方法执行后,指针就会移动到文件末尾,所以再次执行read()方法就读取不到任何内容:

happysneaker.com


文件打开方式:

happysneaker.com


注意,一般readline()用的更多:

happysneaker.com


happysneaker.com



应用:

复制小文件内容到另一个文件:

第一步打开源文件和以只读方式打开目标文件,第二步先读取源文件并赋值给一个中间站,然后目标文件执行write方法,参数设置为中间站即可:

happysneaker.com


但如果文件太大,一次复制占太多内存怎么版,所以用到了一行一行的读,readline(),读一行复制一行,一行一行的读,肯定会用到循环格式。判断是否读取完,只需要 if not text:break 进行判断即可。

happysneaker.com

happysneaker.com









7. 编码方式:


happysneaker.com


① 

happysneaker.com


注意python2中需要使用 小 u,因为是按照字节遍历:

happysneaker.com






特殊知识点:eval()函数,它会自动执行并且返回:

happysneaker.com

happysneaker.com


但是但是不能滥用这个eval()来转换用户输入,容易造成安全问题,可以直接运行好多系统命令:

happysneaker.com


Web安全技术分享
请先登录后发表评论
  • 最新评论
  • 总共0条评论