python-__init__的作用--url编码解码--参数化--单例模式--day(9)
一、__init__的作用
tools文件夹下有两个文件,mysql.py和redis.py,想要引用tools文件下两个文件
1、当__init__文件内容如下
a.py和tools同目录
文件引用会执行__init__文件
想要引用tools目录下的两个文件,会报错
在__init__下引用两个文件就不会报错
二、urllib.parse拼接url,防止因为多输入‘/’,导致url不正确
三、url编码,解码
引用其他目录下的文件标红报错,解决方式--增加环境变量 项目根目录--右键,选择如下图
四、获取setting文件的根目录:
1 base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#目录如何写:不能写成死的,显示获取setting,然后是config,然后是utp_ymy获取到跟目录 2 # os.path.abspath(__file__):获取当前目录setting 3 # os.path.dirname(os.path.abspath(__file__))#获取上一级目录 config 4 # os.path.dirname(os.path.dirname(os.path.dirname(__file__)))#获取config目录的上一级目录utp,得到根目录
五、参数化:
import jsonpath import os import xlrd from config.setting import log def get_value(dic, key): ''' 这个函数是从一个字典里面,根据key获取vlaue :param dic:传一个字典 :param key:传一个 :return:如果有,返回key取到value,如果key没有,返回空字符串 ''' result = jsonpath.jsonpath(dic, '$..%s' % key) if result: return result[0] return '' class GetTestData: @staticmethod def data_for_txt(file_name): log.debug('开始读取参数化文件%s' % file_name) if os.path.exists(file_name):#判断文件存在 with open(file_name, encoding='utf-8') as fr: data = [] for line in fr: if line.strip(): line_data = line.strip().split(',') data.append(line_data) return data log.error('%s参数化文件不存在' % file_name) raise Exception('%s参数化文件不存在' % file_name) @staticmethod def data_for_excel(file_name, sheet_name=None): log.debug('开始读取参数化文件%s' % file_name) if os.path.exists(file_name): data = [] book = xlrd.open_workbook(file_name) if sheet_name: sheet = book.sheet_by_name(sheet_name) else: sheet = book.sheet_by_index(0) for row_num in range(1, sheet.nrows):#跳过表头,不取第一行0 row_data = sheet.row_values(row_num) data.append(row_data) return data log.error('%s参数化文件不存在' % file_name) raise Exception('%s参数化文件不存在' % file_name)
六、单例模式
1 class Person: 2 def __init__(self): 3 self.name = 'dd' 4 p1 = Person() 5 p2 = Person() 6 p1.name = 'aa' 7 print(p1.name) 8 print(id(p1)) 9 print(p2.name) 10 print(id(p2))
使用单例模式后,所有实例化结果都一样
1 class Person: 2 __instance = None 3 def __init__(self): 4 self.name = 'dd' 5 6 def __new__(cls, *args, **kwargs): # 在__init__执行的 7 if cls.__instance: # 判断如果实例值不为空 8 return cls.__instance # 返回这个实例 9 cls.__instance = super().__new__(cls) # 说明是第一次实例,调用父类的__new__的方法,存在cls.__instance,产生一个类 ) 10 return cls.__instance # 返回这个实例 11 12 p1 = Person() 13 p2 = Person() 14 p1.name = 'aa' 15 print(p1.name) 16 print(id(p1)) 17 18 print(p2.name) 19 print(id(p2))