python的包以及补充单例方法

535 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天

包的定义

包的里面只能放python格式的文件(这个文件内必须有__ init __.py文件)

image-20220426205158058.png

在上幅图中模块包和项目是这样的关系:项目-->包-->模块

包的导入

  • 我们可以在一个包里定义多个模板
User
 |-- __init__.py
 |--model1.py
	|-- User
 |-- model2.py
    |-- Art
Artical
 |-- __init.py
 |-- note.py   
run.py    
# model1
class User:
    def __init__(self,username,password):
        self.username = username
        self.password = password
    def login(self,username,password):
        if self.username == username and self.password == password:
            print('登陆成功')
        else:
            print('登录失败')
    def show(self):
        print('admin:{},password:{}'.format(self.username,self.password))

下面我们想调用包里面的类和方法怎么办呢?

  • from ... import ...
#调用包内的模块
from User import model1
user = model1.User('admin',123456)
user.show()
#调用包内的模块中的类
from User.model1 import User
user = User('admin',123456)
user.show()
#调用包里所有的模块的方法
import User.model1 import *

注意:在这里特别注意一下,我们在一个包中,两个模块在相互调用时也必须遵守上述的导入规则,并不能因为两者在一个包内就可以随意调用,如果真的要偷懒可以这样调用(不推荐)

# 比如在model1里面调用model2
from .model2 import Art 

包的__ init __.py文件

当导入包时,默认执行__ init __.py这个文件的内容(其实与前面的魔术方法类似,就是打开包直接初始化,不用二次调用)

  • 所以我们要用该文件内的东西直接导包即可
import 包的名
  • 作用
  1. 当导入包时,把一些初始化函数,类定义在__ init __.py文件中
  2. 此文件的函数和变量访问只需要通过导入包就能使用即(包名.函数名())即可使用
  3. 如果在此文件中加入__ all __ = ['模块a'],那我在使用from 包名 import *方法就能直接使用all列表里暴露的模块a
# User的__init__.py
__all__ = ['model1']
#直接调用包的所有东西
from User import *
#因为上面的__init__.py内向外面暴露了model1,所以我们直接这样导入可以使用model1的东西
user = model1.User('admin',123456)

单例模式

为了不让每次创建对象时都开辟内存,我们在开发中就会使用单例模式

  • 对__ new __方法重写
class Sing:
    # 私有化,让单例的地址存在于此
    __instance = None
    
    #重写__new__
    def __new__(cls):
        if cls.__instance is None:
            cls.instance = object.__new__(cls)
            return cls.instance
        else:
            return cls.__instance
  • 优点:保证单线程的安全,可以节省内存空间