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

相关推荐
xxie12379414 小时前
return与print
开发语言·python
秋914 小时前
从 Python 后端工程师转型 AI Engineer(AI 工程化)的完整补课清单(2026实战版)
开发语言·人工智能·python
程序员二叉14 小时前
【Java】 异常高频面试题精讲 | 易错点+对比总结
java·开发语言·面试
慕木沐15 小时前
Google ADK Java 1.0版本 核心机制与实战 Demo
java·开发语言·python
Tbisnic15 小时前
AI大模型学习第十一天:技术选型、安全防护与金融实战
python·学习·ai·大模型·提示词工程
Roann_seo%15 小时前
C++文件操作完全指南:从文本读写到二进制文件处理
开发语言·c++
hboot15 小时前
AI工程师第一课 - Python
前端·后端·python
huangdong_16 小时前
淘宝商品SKU图自动分类技术深度解析:从DOM解析到智能归档
开发语言·javascript·ecmascript
阿正的梦工坊16 小时前
【Rust】12-借用检查器与非词法生命周期
开发语言·后端·rust
许彰午16 小时前
30_Java Stream流操作全解
java·windows·python