理解coalpress其一

分析一个Django,从视图开始

整体项目

结构如图示

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

get_json_values函数中,将空字符串分配给三个变量:Gzm_sZk_sZj_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 的类,它有两个属性 nameage,以及一个方法 say_hello。然后我们通过类来实例化两个对象,person1person2。每个实例都有自己的 nameage 属性,并且可以调用 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 方法是否返回 TrueEx_InitModel 用来初始化 Gzm_sZk_sZj_s 这三个变量。

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

	return JsonResponse(result_dict, safe=False)

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

初始化函数init

接下来进入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_strZk_strZj_str。这里的 self习惯用法

接下来调用三个方法:Ini_GzmIni_ZkIni_Zj,并传递相应的参数 Gzm_strZk_strZj_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_1str2_2 分别赋值给 str2_1str2_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_InputS_InputES_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 的方法接收两个参数:selfstr,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()
TBase
image-20230729180522310

名为 TBase 的类,其中:

class TBase(object):
    def __init__(self):
        self.Visible = True
        self.Enabled = True
        self.Keyword = ''
        self.Name = ''
  1. 这是一个名为 TBase 的类定义,继承自 object

    什么是“object”

    object 是 Python 中的一个内置基类。所有的类都直接或间接地继承自 object,它是 Python 中所有类的基类。在 Python 3 中,即使没有显式地指定父类,所有的类也会默认继承自 object,比如下面这两种方式是等价的:

    # 不指定父类,默认继承自 object
    class TBase:
        # 类定义...
    
    # 指定父类为 object
    class TBase(object):
        # 类定义...
    
  2. 在类的构造函数 __init__ 中,初始化了四个属性:

    • self.Visible:布尔,默认 True
    • self.Enabled:布尔,默认 True
    • self.Keyword:字符串,默认空 ''
    • self.Name:字符串,默认空 ''
def Base_Input(self, str):
        data = json.loads(str)
        self.Visible = data['Visible'] if ('Visible' in data) else True
        self.Enabled = data['Enabled'] if ('Enabled' in data) else True
        self.Keyword = data['Keyword'] if ('Keyword' in data) else ''
        self.Name = data['Name'] if ('Name' in data) else ''
        return True
  • Base_Input

    方法:这是一个类方法,用于将传入的 JSON 字符串 str解析为 Python 的字典或列表。然后为类实例赋值。

    • 如果 JSON 数据中包含键 'Visible',则将对应的值赋给 self.Visible;否则,将 self.Visible 设置为默认值 True
    • 后三者同理;
    • 最后,方法返回 True,表示成功处理了输入数据。
def Base_Output(self):
        data = {
            'Visible': self.Visible,
            'Enabled': self.Enabled,
            'Keyword': self.Keyword,
            'Name': self.Name
        }
        return data
  • Base_Output 用于输出类实例的数据。打包为一个字典 data,包含了四个键值对,分别对应 VisibleEnabledKeywordName 属性的值。然后将这个字典返回。

综上可得,这个类 TBase 主要用于处理属性的输入和输出。

posted on 2023-07-29 18:12  言行一  阅读(9)  评论(0编辑  收藏  举报