从零学习python - 13模块的导入与使用(实现单例模式)

news/2024/9/23 22:31:08/

模块基础知识

# 项目 > 包 > 模块 > 变量\方法\类
# 在python中,模块是代码组织的一种方式,把功能相近的函数或类放到一个文件中,一个文件(.py)就是一个模块,模块名就是文件名去掉py后缀.
# 好处:提高代码可复用性和可维护性,一个模块编写完成后,很方便在其他项目中导入.解决了命名冲突问题,不同模块相同的命名不会冲突.
# 模块中可以存放变量,函数,类三种类型,并且在 import 模块名后,可以使用模块名进行调用 模块名.变量 模块名.函数 模块名.类
常用标准库:
builtins            内建函数默认加载
math                数学库
random              生产随机数
time                时间
datetime            日期和时间
calendar            日历
hashlib             加密算法
copy                拷贝
functool            常用的工具
os                  操作系统接口
re                  字符串正则匹配
sys                 python自身运行环境
multiprocessing     多进程
threading           多线程
json                编码和解码json对象
logging             日志记录,调试
# 在开发过程中肯定会遇到不同的问题,但如果已经有模块解决了这部分问题,我们就可以把这个模块叫过来帮忙.(基于项目导包)
# 我们可以通过以下方式实现模块导入(导入也是一个动作,会默认将模块内的代码加载进内存空间):
# 1- import 模块名: 这种方法导入模块,我们在需要使用模块中的变量\函数\类的时候,都需要以(模块名.变量 模块名.函数 模块名.类)的形式来调用# 2- from 模块名 import 变量,函数,类: 表示从模块中导入具体功能,这种方法导入模块可以直接使用导入的模块变量\函数\类# 3- from 模块名 import *: 表示导入该模块的所有内容,模块中可以定义__all__=[用来限制可以被*导入的变量\方法\类]# 4- from 包名 import 模块名: 导入后,需要使用 (模块名.变量\方法\类) 的方式调用# 5- from 包名.模块名 import 变量,函数,类: 如果导入某个包名下的模块,可以使用这个方法,导入进来的变量,函数,类可以直接使用.# 6- from .模块名 import 变量,函数,类: '.'表示从当前包内导入# 不管是import还是from的方式导入模块,都会将模块内的内容进行加载.这时模块中有方法调用的话,加载模块时就会执行模块中调用的方法.
#   如果不希望执行这个方法,需要使用 __name__ . __name__在自己的模块中值为__main__,出了本模块__name__的值为自身模块名.所以可以进行判断.

 

# 文件夹可以存放一些非.py文件# 包中存放的都是.py文件,包在创建后会自动创建一个__init__.py文件(初始化加载),包中存放多个模块.# __init__.py文件的功能1: 只要导入这个包的时候,就会默认执行__init__.py中的内容,将__init__中的内容加载进内存,里面的方法和类可以使用包名调用.
# 如果有些使用这个包就需要的出现的东西,就可以写在这里进行初始化加载.# 功能2: 如果使用from 包名 import *: 这种方式想要把这个包内的所有内容导入,需要在__init__.py模块中添加__all__ = [向外暴露的模块],否则无法导入
# 关于循环导入: 架构出错会出现循环导入问题
from B import b
# A.py中def a(self):b()from A import a   
# B.py中def b(self):a()
# 上面的两个类分别处于两个模块中.当运行a()方法时,会因为需要B模块中的b()方法而执行 'from B import b'
# 当导入时B模块中的b()方法时需要执行a()方法,所以会执行 'from A import a' 这样就会陷入循环导入而报错.
# 避免循环导入: 1-重新架构 2-可以将导入语句放到函数体中或最后,需要使用时才进行导入,例如下方所示:
A.py中def a(self):from B import bb()

 常用标准类库的使用

# 系统模块
print(sys.path)  # 系统会在哪些目录下搜索你要加载进来的模块,并按照搜索顺序依次打印
print(sys.version)  # 3.10.10 (tags/v3.10.10:aad5f6a, Feb  7 2023, 17:20:36) [MSC v.1929 64 bit (AMD64)]
print(sys.argv)  # ['D:\\python_Projects\\object_try\\Object_12系统模块.py'] 运行程序时的一些参数 argv是一个列表,默认存放程序本身
# time模块
print(time.time())  # 1681367610.33326 
# 返回当前时间(以秒为单位)浮点数表示 得到时间戳 经常用来求执行某段代码的时间差time.sleep(1)  # 延迟执行给定的秒数。# 将时间戳形式转换成字符串或元组形式
t = time.time()
print(time.ctime(t))  # 将传入的时间戳转为字符串形式 Thu Apr 13 14:38:00 2023
print(time.localtime(t))  # 以元组的形式转换时间戳 time.struct_time(tm_year=2023, tm_mon=4, tm_mday=13, tm_hour=14, tm_min=39, tm_sec=26, tm_wday=3, tm_yday=103, tm_isdst=0)# 将time.time()的元组形式转换为时间戳
l = time.localtime(t)
print(l.tm_year)  # 2023   元组形式的好处,可以使用元组时间戳对象单独访问元组的内容(年,月,日)
print(l.tm_mon)  # 4
print(time.mktime(l))  # 1681368145.0 去掉精度值# 将元组的时间转换为字符串 根据格式规范将时间元组转换为字符串。
strf_time = time.strftime('%Y-%m-%d %H:%M:%S')
print(strf_time)  # 2023-04-13 14:49:33 根据格式转换# 将字符串转换为元组的方式
r = time.strptime('2023-04-13', '%Y-%m-%d')
print(r)  # time.struct_time(tm_year=2023, tm_mon=4, tm_mday=13, tm_hour=0, ...)
# datetime模块

datetime模块下有:time 时间date 日期datatime 日期时间timedelta 时间差 时间差值经常在缓存设置时通过与时间差计算,得到缓存保留多长时间的作用
print(datetime.time)  # <class 'datetime.time'> 返回datetime.time对象
print(datetime.date)  # <class 'datetime.date'> 返回datetime.date对象
print(datetime.date.today())  # 2023-04-13 返回当前日期now = datetime.datetime.now()  # 得到当前日期和时间的时间戳
print(now)  # 2023-04-13 15:12:53.024391
timedelta = datetime.timedelta(hours=5)  # 时间差值:支持传递参数有days=0, seconds=0, microseconds=0,milliseconds=0, minutes=0, hours=0, weeks=0
print(timedelta)  # 5:00:00 当前timedelta的值(时间差值)
time_fix = now + timedelta  # 假如说要保存5个小时,通过计算得到结果.timedelta支持两个timedate对象进行计算操作
print(time_fix)  # 五小时后失效的时间为:2023-04-13 20:12:53.024391
# random模块
print(random.random())  # 得到0-1之间的随机小数
# randrange(start,end,[步长]),如有步长,则会从通过步长遍历后的范围内得到随机数 (1, 10, 2) => 1,3,5,7,9
print(random.randrange(1, 10))  # 从start到end中随机一个数字.但不包含end这个数字
print(random.randint(1, 10))    # 从start到end随机一个数字,包含end
# choice(seq) 从非空序列中选择一个随机元素
list1 = ['你', '我', '他']
print(random.choice(list1))  # 我\你\他
# shuffle(x)    打乱列表顺序,函数返回None
random.shuffle(list1)
print(list1)    # 打乱后顺序:['你', '我', '他'] => ['他', '我', '你']
random完成验证码功能
def get_verifycode():code = ''for i in range(4):# 从0,9之间随机一个数字转换为字符串形式ran1 = str(random.randint(0, 9))# 从Unicode字符中随机一个,并通过chr()将Unicode字符强转为str  ord()则反之ran2 = chr(random.randint(65, 90))ran3 = chr(random.randint(97, 122))r = random.choice([ran1, ran2, ran3])code += rreturn codeprint(get_verifycode())  # 9N0t
hashlib模块

# 加密算法  支持'md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512',
#                       'blake2b', 'blake2s',
#                       'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512',
#                       'shake_128', 'shake_256' 加密
msg = '我爱你'
md_5 = hashlib.md5(msg.encode('utf-8'))
print(md_5.hexdigest())  # 4f2016c6b934d55bd7120e5d0e62cce3 加密之后的数据

 第三方库

# 第三方库 : 非标准库的模块,需要自己导入到项目中
# 第三方库需要在控制台pip下载包 pip install 模块名   也可以通过File->settings->project:->Python Interpreter中手动管理

单例模式的实现

# 开发模式:单例模式
# 我们平时定义的类可以无限创建对象使用类中的属性和方法,每个对象都会在内存中开辟一块空间
class Person:passp1 = Person()
p2 = Person()
# 不同对象开辟的不同内存地址
print(p1)  # <__main__.Person object at 0x00000207650A71F0>
print(p2)  # <__main__.Person object at 0x00000207650A6FB0>
# 那如果我们并不需要很多对象产生,只是需要使用这个类中的某些功能方法,使用时才调用这块内存空间,该怎么办呢?
# 这时候我们就需要使用单例模式,无论我们在创建时使用的哪种形式,我们在使用时都使用的是同一个对象!一个实例搞定!
class Singleton:# 先定义也给属性,准备用这个属性承接开辟出来的内存空间并返回__instance = None# 重写类的__new__()方法def __new__(cls, *args, **kwargs):if cls.__instance is None:# 如果属性为空,则调用object.__new__()方法开辟内存空间,并赋值给类__instancecls.__instance = object.__new__(cls)# 这里会将内存地址默认返回给__init__()方法,初始化动作完成后赋值给对象名# 当后续调用时,类属性就不为空了,所以返回的还是这个对象内存地址return cls.__instances1 = Singleton()
s2 = Singleton()
print(s1)  # <__main__.Singleton object at 0x000001B0F7ED54B0>
print(s2)  # <__main__.Singleton object at 0x000001B0F7ED54B0>

 完成!


http://www.ppmy.cn/news/42965.html

相关文章

day9 条件变量的基本使用

目录 条件变量 条件变量 应用场景&#xff1a;生产者消费问题&#xff0c;是线程同步的一种手段&#xff1b; 必要性&#xff1a;为了实现等待某个资源&#xff0c;让线程休眠&#xff0c;提高运行效率&#xff1b; 等待资源&#xff1a; //1、一直等待资源 int pthread_c…

016 - 如何写一个 C++ 类

到目前为止&#xff0c;我们学了类 class&#xff0c;本期我们要尝试着从头开始写一个类。 本期不会讲的太深。我们不会写非常复杂的类&#xff0c;我们要会完成一个基本的 log 类&#xff0c;来演示一下我们已经学过的相关知识。 接下来的几期&#xff0c;我们会继续学习类。…

QT Graphics View坐标系转换

背景 在做绘图处理时&#xff0c;Scence作为场景&#xff0c;大小是无限的&#xff0c;而View作为一个观察镜头&#xff0c;观察范围是有限的。 那么有限的View观察无限的Scence区域&#xff0c;必然要选定一个观测锚点。 所以View具有一个centerOn(QPointF pos)函数&#xff…

SFSpeechRecognitionTask.error 错误码对照表

iOS 语音识别引擎中常见错误对照表 加注释了 error An error object that specifies the error that occurred during a speech recognition task. iOS 10.0 macOS 10.15 Mac Catalyst 13.1 Declaration property(nonatomic, readonly, copy, nullable) NSError *error;…

uview-ui工具函数的使用

uview-ui工具函数的使用安装在main.js全局引入工具函数的使用1. 函数防抖、节流2. 对象转url参数3. 路由封装4. 时间格式化5. 求两个颜色渐变之间的值6. 生成全局唯一guid字符串7. 获取主题相关颜色8. 根据type获取图标名称9. 打乱数组的顺序10. 对象和数组的深度克隆11. 对象和…

2.4 随机变量函数的分布

学习目标&#xff1a; 学习随机变量函数的分布&#xff0c;我会采取以下步骤&#xff1a; 熟悉随机变量的基本概念和分布&#xff1a;在学习随机变量函数的分布之前&#xff0c;需要先掌握随机变量的基本概念和分布&#xff0c;包括离散型随机变量和连续性随机变量的概率密度…

UTF-8(Unicode Transformation Format)

文章目录一、Unicode示例代码&#xff1a;二、网络传输与Unicode三、UTF-8如何编码四、使用UTF-8转换传输Unicode五、利用Java-API进行UTF8编码和解码六、利用代码输出Unicode编码和UTF8编码七、手写UTF8编码、解码八、总结UTF8一、Unicode 示例代码&#xff1a; package demo…

项目管理中的冲突是什么?

项目管理中的冲突可以采取多种不同的形式。团队成员在创意愿景上存在分歧&#xff0c;与高层管理人员就期望和时间表发生争执&#xff0c;甚至与第三方供应商发生争执&#xff0c;都是项目冲突的主要例子。 冲突的常见原因是什么&#xff1f; 基于项目的组织内部冲突的典型原因…