__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()
# 同级,中文问题