单例模式
单例模式就是让类创建的对象,在系统中只有唯一的实例
__new__方法是object类内置的静态方法
作用:1. 在内存中为对象分配空间 2.返回对象的引用
class MusicPlayer(object):
def __init__(self):
print("播放器初始化")
def __new__(cls, *args, **kwargs):
# 创建对象时,new方法会被自动调用
# 需要返回对象的引用
# 为对象分配空间
return super().__new__(cls)
单例模式演示
class Garbag(object):
# 记录第一个创建对象的引用
instance = None
# 记录是否执行过初始化动作
init_flag = False
# 单例模式的思路:定义一个空的类属性,如果第一次初始化为空,就返回一个新的引用
# 如果之后再初始化,直接判断类属性是否为空,不为空直接返回类属性保存的引用
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
else:
return cls.instance
def __init__(self):
if Garbag.init_flag:
return
Garbag.init_flag = True
print("初始化")
异常
异常捕获
try:
# 不能确定的代码
num = int(input("请输入一个整数"))
except:
# 如果异常要执行的代码
print("请输入正确整数")
else:
# 没有异常才会执行
print("hello world")
finally:
# 正常程序代码,无论有无异常,都会执行
print("*" * 50)
错误类型捕获
格式: except 错误类型:
except (错误类型1,错误类型2):
try:
num = int(input("请输入一个整数:"))
result = 8 / num
print(result)
except ZeroDivisionError:
print("除0错误")
except ValueError:
print("请输入整数")
# 判断未知的错误
except Exception as err_result:
print("%s——未知错误" % err_result)
抛出异常
def input_pwd():
password = input("请输入密码")
if len(password) >= 8:
return password
else:
# 创建一个异常对象
ex = Exception("密码长度不够")
raise ex
try:
print(input_pwd())
except Exception as result:
# 直接将异常的字符串输出
print(result)
引用模块
import 模块名
# 别名应该用大驼峰命名法
import 模块名 as 别名
#也可以直接使用from导入模块的部分工具(全局变量,函数,类)
# 从不同的模块导入相同的函数,后导入的函数会覆盖之前的函数,可以通过起别名分辨
from long_name_demo import Dog
dog =Dog()
# 可以一次性导入所有工具(不推荐使用)
from 模块名 import *
# 可以通过__file__查看模块的完整路径
print(__file__)
# 可以查看模块的名称
print(__name__)
导入模块时,直接可以执行的代码都会直接执行
但是,这些测试代码并不是我们导入模块时想要的
所以,需要对代码进行改变
def main():
# 测试代码
pass
if __name__ == "__main__":
main()
包的概念
如果我们需要导入很多模块时,可以将模块保存至包内,直接导入包
包的目录下有一个py文件,init.py
init.py文件用来保存希望外界访问的模块
from . import 模块名
包的发布和安装
PIP安装第三方模块
pip3 install 模块名
pip3 uninstall 模块名