理解coalpress(其一)

发布时间 2023-07-29 17:32:40作者: 言行一

分析一个Django,从视图开始

整体项目结构如图示

image-20230729145731813
  1. get_json_values:
def get_json_values(request):
    Gzm_s = ''
    Zk_s = ''
    Zj_s = ''
    
    Ex_Guid = TGuid_StopeClass()  # 创建一个实例

在get_json_values函数中,将空字符串分配给三个变量:Gzm_s,Zk_s 和 Zj_s。然后创建 TGuid_StopeClass 类的实例,并将其赋值给变量 Ex_Guid。

什么叫“类的实例”:

通过实例化(即创建)一个类来得到的对象。用于描述对象的属性和行为。而类的实例则是基于这个类创建的具体对象,它具有类所定义的属性和行为。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say_hello(self):
        print(f"Hello, my name is {self.name} and I am {self.age} years old.")

# 创建类的实例
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)

定义了一个名为 Person 的类,它有两个属性 name 和 age,以及一个方法 say_hello。然后我们通过类来实例化两个对象,person1 和 person2。每个实例都有自己的 name 和 age 属性,并且可以调用 say_hello 方法。

例如,

print(person1.name)  # 输出: Alice
print(person2.age)   # 输出: 25

person1.say_hello()  # 输出: Hello, my name is Alice and I am 30 years old.
person2.say_hello()  # 输出: Hello, my name is Bob and I am 25 years old.

继续看views:

	# 从前端获取数据
    if Ex_Guid.Ex_InitModel(Gzm_s, Zk_s, Zj_s):
        result_dict = Ex_Guid.Output_str("ZK")
    else:
        result_dict = Ex_Guid.warning

​ 这部分代码检查 Ex_Guid 实例的 Ex_InitModel 方法是否返回 True。Ex_InitModel 用来初始化 Gzm_s,Zk_s 和 Zj_s 这三个变量。

​ 初始化之后使用参数 "ZK" 调用 Ex_Guid 实例的 Output_str 方法,结果赋给变量 result_dict。否则,它将 Ex_Guid.warning(一条警告消息)赋值给 result_dict。

	return JsonResponse(result_dict, safe=False)

最后,该视图返回一个JSON响应。

接下来进入Ex_InitModel的函数:

def Ex_InitModel(self, Gzm_str, Zk_str, Zj_str):
    Gzm_bool = self.Ini_Gzm(Gzm_str)
    Zk_bool = self.Ini_Zk(Zk_str)
    Zj_bool = self.Ini_Zj(Zj_str)

Ex_InitModel 接收四个参数:self(指向类实例自身的引用)、Gzm_str、Zk_str 和 Zj_str。这里的 self 是习惯用法;

接下来调用三个方法:Ini_Gzm、Ini_Zk 和 Ini_Zj,并传递相应的参数 Gzm_str、Zk_str 和 Zj_str 进去。

	self.successed = True if (Gzm_bool and Zk_bool and Zj_bool) else False
   	return self.successed

使用 and 运算来判断三个方法的返回值是否全部为 True,然后将结果赋值给实例的属性 self.successed。如果三个方法的返回值都为 True,那么 self.successed 将被赋值为 True,否则将被赋值为 False。

最后,方法返回 self.successed;(这意味着调用这个方法后,可以通过得到的返回值来判断整个初始化过程是否成功)

image-20230729151748231

先以Gzm为例,

def Ini_Gzm(self, str):
    if str == '':
        str2_1 = "GZM:16,12011工作面,二煤,4.5,综采,0,3.4,600,214,1640,100,1,25,20000,0.3,2,3"
        str2_2 = "GZM_D:5,2902工作面,4,2.6,综采,2.4,12,5,470,550,510,300,650,3,1,2,1,1,1,1,1,2,2,0,0,0,0,100"
        
        str = str2_1

先检查传入的参数 str 是否为空字符串。如果是空字符串,则将两个字符串 str2_1 和 str2_2 分别赋值给 str2_1 和 str2_2 变量。然后将 str2_1 的值赋值给参数 str,即方法中的 str 变量,后面再使用。

    if str.startswith("{") and str.endswith("}"):
        # 第一种,json输入方法
        if not self.Ex_Gzm.Base_Input(str): sys.exit()

        if self.Ex_Gzm.Keyword == 'GZM':
            self.Ex_Gzm.S_Input(str)
            return True
        elif self.Ex_Gzm.Keyword == 'GZM_D':
            self.Ex_Gzm.ES_Input(str)
            return True
        else:
            self.warning.append('GZM拼写错误或缺失;')
            return False

接下来,代码检查 str 是否以 { 开头且以 } 结尾。如果满足这个条件,那么执行 if 语句块中的代码。

在这里,代码使用了一个 self.Ex_Gzm 实例来调用三个不同的方法:Base_Input、S_Input 和 ES_Input,并传递参数 str 给它们。

  • 如果 Base_Input 方法的返回值为 False,则调用 sys.exit() 来终止程序运行(退出程序)。
  • 如果 关键字是 'GZM',则调用 S_Input 方法,并返回 True。
  • 如果关键字是 'GZM_D'(更长的那串),则调用 ES_Input 方法,并返回 True。
  • 否则,将一条错误信息添加到 self.warning 列表,并返回 False。
	else:
        # 第二种,字符串输入方法
        if str.startswith('GZM_D'):
            self.Ex_Gzm.Keyword = 'GZM_D'
            self.Ex_Gzm.ES2_Input(str)
            return True
        elif str.startswith('GZM'):
            self.Ex_Gzm.Keyword = 'GZM'
            self.Ex_Gzm.S2_Input(str)
            return True

        else:
            self.warning.append('GZM拼写错误;')
            return False

如果 str 不是以 { 开头或者不是以 } 结尾,那么执行 else 语句块中的代码。

先看是否以 'GZM_D' 开头或者以 'GZM' 开头。如果满足这些条件,那么执行相应的 if 语句块中的代码,其余原理同上;

接下来是ZK:

image-20230729152454410
  1. def Ini_Zk(self, str):

    ​ Ini_Zk 的方法接收两个参数:self 和 str,str 是方法的第二个参数;

  2. if str == '':

    ​ 检查传入的参数 str 是否为空。如果 str 是空字符串,那么执行 if ;

  3. 定义一个包含钻孔信息的字符串 str,

    ​ 是默认的钻孔信息数据。如果传入的 str 为空,那么将使用这个默认的钻孔信息数据来初始化 str;

  4. if str.startswith('ZK'):

    ​ 检查 str 是否以 'ZK' 开头。如果满足这个条件,那么执行 if ;

  5. self.Ex_Zk.Keyword = 'ZK'

    ​ 将类实例的属性 self.Ex_Zk.Keyword 的值设为 `'ZK';

  6. self.Ex_Zk.Zk_Input(str)

    ​ 调用类实例的 Ex_Zk 属性的方法 Zk_Input,并将参数 str 传递给它;

  7. return True

    ​ 最后返回 True,表示成功处理了 'ZK' 类型的数据;

    如果 str 不是以 'ZK' 开头,那么执行 else ;

    self.warning.append('ZK拼写错误;') 将 'ZK拼写错误;'添加到类实例的 self.warning 列表;

    return False 最后返回 False,表示没有成功处理 'ZK'

最后来到output:

    def Output_str(self, Key):
        if Key == 'GZM':
            if self.Ex_Gzm.Keyword == 'GZM_D':
                return self.Ex_Gzm.ES_Output()
            elif self.Ex_Gzm.Keyword == 'GZM':
                return self.Ex_Gzm.S_Output()
        
        elif Key == 'ZK':
            return self.Ex_Zk.Zk_Output()
        elif Key == 'ZJ':
            return self.Ex_Zj.Zj_Output()
            """
            根据传入的 Key 参数,决定调用不同属性的不同方法,从而输出对应类型的数据。如果 Key 参数为 'GZM',那么会调用 Ex_Gzm 属性的 S_Output 或 ES_Output 方法输出 'GZM' 或 'GZM_D' 类型的数据; 如果 Key 参数为 'ZK',那么会调用 Ex_Zk 属性的 Zk_Output 方法输出 'ZK' 类型的数据; 如果为 'ZJ',那么会调用 Ex_Zj 属性的 Zj_Output 方法输出 'ZJ' 类型的数据。
            """

以ZJ为例:

image-20230729153629324
    # 接收 input_str,是一个 JSON 字符串,使用 json.loads() 将其解析为字典或列表;
    # 调用 self.value_Zj_Input(data) 方法,将解析后的数据传递给它,然后返回 True,表示成功处理了输入数据;
    def Zj_Input(self, input_str):
        data = json.loads(input_str)
        self.value_Zj_Input(data)
        return True
    # 接收一个参数 data(字典)检查 data 字典中是否包含特定键值来赋值。如果 data 字典中包含【键】 'Zj_Name',则将【值】赋给 self.Zj_Name;
    def value_Zj_Input(self, data):...
    
    # 第二种text解析方法
    # 接受的是文本字符串,先将 "ZJ:" 替换为空然后使用 split(',') 将剩余字符串按逗号分隔,并形成一个列表 Zj_info;
    # try 和 except 块将列表中的每个元素转换,转换失败(出现 ValueError)触发 except 调用 sys.exit() 来退出
    def Zj2_Input(self, input_str):
        Zj_info = input_str.replace('ZJ:', '').split(',')
        try:...
        except json.JSONDecodeError:
            sys.exit()