【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类型的字段

相关推荐
第九序言T7 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Java后端的Ai之路7 小时前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
qq_426003967 小时前
UI自动化高频次登录login限流解决方案
python·ui·自动化
Sakura_j_h_8 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
龙亘川8 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人8 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
quantdash_cc9 小时前
如何验证历史行情的交易日期是否完整覆盖研究区间?
python·数据分析·pandas·量化交易·股票数据·quantdash
I Am a robert girl9 小时前
当智能体学会“串通”:从长程交互中读懂涌现式合谋
python·多智能体系统·多智能体协作·llm agent·涌现式合谋·对齐问题·激励机制设计
Raas1009 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
云和数据.ChenGuang10 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain