【python + flask】字典字段对模型字段的自动赋值,抽象编程思维培养,框架能力

场景:

客户端提交上来的数据

python 复制代码
# @Time      :2024-2024/2/27-10:40
# @Author    :Justin
# @Email     :514422868@qq.com
# @file      :demo1.py
# @Software  :FisherBook

# class A():
#     def __enter__(self):
#         print("I am enter!")
#         # 这里必须要return self 否则 as b中报错
#         return self
#
#     def __exit__(self, exc_type, exc_val, exc_tb):
#         print("i am exit")
#
#     def query(self):
#         print("i am query")
#
#
# a = A()
# a.query()
# with A() as b:
#     b.query()
#
#
# class Sample:
#     def __enter__(self):
#         print("in enter!")
#         return "aaa"
#
#     def __exit__(self, exc_type, exc_val, exc_tb):
#         print("in exit")
#
#     @staticmethod
#     def get_sample():
#         return Sample()
#
#
# s = Sample()
# with s.get_sample() as sample:
#     print("sample:", sample)
from contextlib import contextmanager

# @contextmanager
import traceback


class MyResource():
    def __enter__(self):
        print("i am enter")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("i am exit")

        if exc_type:
            print(exc_type, exc_val, exc_tb)
            print(traceback.format_exc())
            raise exc_val

    def query(self, data):
        print("i am query data")


with MyResource() as r:
    r.query(data=[])

print("-------------")
from contextlib import contextmanager


@contextmanager
def make_myresource():
    print("connect to resource!")
    yield MyResource()
    print("close resource connection!")


try:
    with make_myresource() as r:
        try:
            r.query([])
        except Exception as e:
            print(traceback.format_exc())
except Exception as e:
    print(e)

from contextlib import contextmanager


@contextmanager
def book_mark():
    print("《", end="")
    yield
    print("》", end="")


with book_mark():
    print("且将生活一饮而尽", end="")
print("-----")


class C:
    @contextmanager
    def ccc(self):
        print("1111")
        yield
        print("33333")


c = C()
with c.ccc():
    print("2222")

print("==========")


# hasattr()
# setattr()
class D():
    id = None
    name = None

    def __init__(self, no=0):
        self.no = no


# 类属性也可以
d = D()
print(hasattr(d, "id"), hasattr(d, "age"), hasattr(d, "no"))

param = {
    "name": "张三",
    "age": 18,
    "gender": 1,
    "class_no": 11
    # 等等很多属性
}


class Student():
    # __slots__ = "name", "age", "gender", "class_no", "__dict__"

    pass


student = Student()
student.name = param["name"]
student.age = param["age"]
student.gender = param["gender"]
student.class_no = param["class_no"]

print(student.age, student.__dict__, student.__dir__())
# var的做法只能将构造函数里面的属性转成字典,而__dict__则范围更广
my_dict = vars(student)
print(my_dict)


class Student2():
    name = None
    age = None
    gender = None
    class_no = None

    def setattrs(self, attrs_dict: dict):
        for key, value in attrs_dict.items():
            if hasattr(self, key):
                setattr(self, key, value)


student2 = Student2()
student2.setattrs(param)
print(vars(student2))

vars 可以将定义过的对象属性或者类属性,还原成字典。

加上slots的则不可以。

hasattr和setattr可以配对使用

也可以用内置的__setattr__(self, key, value)来处理。

2.统一处理

比如有些字段,时间则需要统一转换,或者自增id在使用时则需要隐藏,

python 复制代码
class Student2():
    name = None
    age = None
    gender = None
    class_no = None

    def __init__(self):
        self.create_time = int(datetime.now.timestamp())

    def setattrs(self, attrs_dict: dict):
        for key, value in attrs_dict.items():
            if hasattr(self, key) and key != "id":
                setattr(self, key, value)

上面的类作为base类,被其它实体类所继承,比如user,order... 这里假定每张表都有create_time的int类型的字段

相关推荐
梦丶晓羽29 分钟前
自然语言处理:最大期望值算法
人工智能·python·自然语言处理·高斯混合模型·最大期望值算法
蜡笔小新..32 分钟前
R语言和RStudio安装
开发语言·r语言
ALPH_32 分钟前
R语言的基础命令及实例操作
开发语言·数据分析·r语言·perl·r语言-4.2.1
咩咩觉主36 分钟前
C# &Unity 唐老狮 No.6 模拟面试题
开发语言·unity·面试·c#·游戏引擎·唐老师
君科程序定做2 小时前
PDFMathTranslate安装使用
python
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧3 小时前
C语言_数据结构总结8:链式队列
c语言·开发语言·数据结构·链表·visualstudio·visual studio
Linzerox3 小时前
Pycharm 取消拼写错误检查(Typo:in word xxx)
python·pycharm
千里码aicood3 小时前
[含文档+PPT+源码等]精品基于Python实现的校园小助手小程序的设计与实现
开发语言·前端·python
讨厌下雨的天空3 小时前
C++之list
开发语言·c++·list
大麦大麦4 小时前
深入剖析 Sass:从基础到进阶的 CSS 预处理器应用指南
开发语言·前端·css·面试·rust·uni-app·sass