Python 中 DAO 層使用泛型的探索

方法一:

from types import UnionType
from typing import TypeVar, Generic, TypeModelT = TypeVar('ModelT')def _new_cls_with_grm_generic_args(cls, __item):new_cls = type(f"{cls.__name__}[{__item.__name__}]", (cls,), {})new_cls._grm_generic_arg = __itemreturn new_clsclass GenericResolveMeta(type):def __getitem__(cls, __item):print('__getitem__')return _new_cls_with_grm_generic_args(cls, __item)class BaseDAO(Generic[ModelT], metaclass=GenericResolveMeta):"""DAO 泛型基類"""def __class_getitem__(cls, __item):print('__class_getitem__')return _new_cls_with_grm_generic_args(cls, __item)def __init__(self):only_one_arg = getattr(self, "_grm_generic_arg", None)if not only_one_arg:raise TypeError("ModelT must be assigned")if isinstance(only_one_arg, UnionType):raise TypeError("ModelT must not be a UnionType")self.model: Type[ModelT] = only_one_argclass Item(BaseDAO[str]):def __init__(self):super().__init__()item = Item()
print(item.model)  # 輸出: <class 'str'># 對一個類使用方括號,首先檢查其元類是否定義 __getitem__ 方法,有則調用,無則檢查該類是否定義 __class_getitem__ 方法,有則調用,無則報錯

方法二:

from types import UnionType
from typing import Generic, TypeVar, get_origin, get_args, TypeModelT = TypeVar('ModelT')class BaseDAO(Generic[ModelT]):"""DAO 泛型基類1. 一個類必須繼承一個 BaseDAO 或者 BaseDAO 子類,不能繼承多個BaseDAO 或者 BaseDAO 子類2. 泛型必須傳入一個類型,通常為 SQLAlchemy 中模型,不可為 types.UnionType"""def __init__(self):orig_bases = getattr(self.__class__, '__orig_bases__', None)if not orig_bases:raise TypeError("__orig_bases__ is empty")target_bases = [c for c in orig_bases if issubclass(get_origin(c), BaseDAO)]if len(target_bases) != 1:raise TypeError(f"{self.__class__} must extend a BaseDAO or BaseDAO's subclass")args = get_args(target_bases[0])if not len(args) == 1:raise RuntimeError("ModelT must be assigned")only_one_arg = args[0]if isinstance(only_one_arg, UnionType):raise TypeError("ModelT must not be a UnionType")self.model: Type[ModelT] = only_one_argclass Item(BaseDAO[str]):...item = Item()
print(item.model)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903884.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903884.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903884.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Cesium 環境搭建

一、前提條件 1. **安裝 Node.js** - 訪問 [Node.js 官方網站](https://nodejs.org/)&#xff0c;下載并安裝適合你操作系統的版本。Node.js 用于運行本地開發服務器和安裝依賴。 2. **安裝 Vue CLI** - Vue CLI 是一個用于快速開發 Vue.js 項目的工具。在終端中運行以下…

DarkGS:論文解讀與全流程環境配置及數據集測試【基于Ubuntu20.04 】【2025最新實戰無坑版!!】

一、背景及意義 DarkGS是一個創新性的研究項目&#xff0c;旨在解決機器人在黑暗或低光照環境中探索的問題。傳統的3D重建和視覺定位系統在光照條件不佳時表現不佳&#xff0c;這嚴重限制了機器人在黑暗環境中的應用&#xff0c;如夜間救援、深海探索或洞穴勘測等場景。 這項工…

(八)RestAPI 毛子(Unit Testing/Integration)

文章目錄 項目地址一、Unit Testing1.1 創建X unit 測試項目1. 創建項目目錄2. 管理包1.2 創建CreateEntryDtoValidator測試1.3 創建CreateEntryDtoValidator測試二、Integration test2.1 創建Integration test環境1. 安裝所需要的包2.2 配置基礎設置1. 數據庫鏈接DevHabitWebA…

設計模式--橋接模式詳解

橋接模式&#xff08;bridge pattern&#xff09; 橋接模式時將抽象部分與它的實現部分分離&#xff0c;使他們可以獨立的變化。它是一種對象結構型模式&#xff0c;又稱為柄體&#xff08;Handle and Body&#xff09;模式或者接口&#xff08;interface&#xff09;模式&…

關于 live555延遲優化之緩存區優化“StreamParser::afterGettingBytes() warning: read”” 的解決方法

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/146354088 長沙紅胖子Qt&#xff08;長沙創微智科&#xff09;博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、OpenCV…

Vite 動態導入靜態資源與自動依賴發現實戰解析

一、Vite 動態導入靜態資源的實現方案 在 Vite 中&#xff0c;動態加載圖片、JSON 等靜態資源是高頻需求&#xff0c;但動態路徑拼接可能導致構建失敗或資源未識別。以下結合示例代碼&#xff0c;分析三種實現方案&#xff1a; 1. 方案一&#xff1a;new URL 動態路徑轉換 通…

在matlab中使用UAV123官方toolkits測試自己的數據集

一、前言 最近需要將自己的跟蹤代碼在自己拍攝的數據集上進行測試&#xff0c;這里我選擇使用 UAV123 官方 toolkits 進行配置。首先需要搞清楚這部分代碼是如何運行的&#xff0c;精度圖和成功率圖是如何繪制出來的&#xff0c;然后再將自己的數據集加進去進行測試。 二、UA…

9.idea中創建springboot項目_jdk1.8

9. idea中創建springboot項目_jdk1.8 步驟 1&#xff1a;打開 IntelliJ IDEA 并創建新項目 啟動 IntelliJ IDEA。在歡迎界面&#xff0c;點擊 New Project&#xff08;或通過菜單欄 File > New > Project&#xff09;。 步驟 2&#xff1a;選擇 Maven 項目類型 在左側…

SpringAI實現AI應用-搭建知識庫

SpringAI實戰鏈接 1.SpringAl實現AI應用-快速搭建-CSDN博客 2.SpringAI實現AI應用-搭建知識庫-CSDN博客 概述 想要使用SpringAI搭建知識庫&#xff0c;就要使用SpringAI中的TikaDocumentReader&#xff0c;它屬于ETL&#xff08;提取、轉換、加載&#xff09;框架中的提取&…

內網服務器映射到公網上怎么做?網絡將內網服務轉換到公網上

如何將內網映射到公網&#xff1f;本地局域網的網絡下部署的內網服務地址轉換到公網上連接訪問是大家比較關注的問題&#xff0c;特別是在無公網IP使用的情況下&#xff0c;很多人不知道怎么做。 在沒有公網 IP 的情況下&#xff0c;要將內網映射到公網&#xff0c;以便外網能…

intellij idea最新版git開啟Local Changes

習慣了在idea的git插件里&#xff0c;查看項目已修改的文件&#xff0c;但是新版idea默認不展示了&#xff0c;用起來很難受。 參考網上教程開啟方法如下&#xff1a; 1. 確保安裝Git Modal Commit Interface插件并開啟該插件 2. 在Advanced Settings開啟Use Modal Commit In…

??智能制造中的預測性維護:基于深度學習的設備故障預測??

智能制造中的預測性維護:基于深度學習的設備故障預測 引言 在智能制造領域,設備突發故障可能導致巨大的經濟損失。傳統維護方式(如定期檢修或事后維修)往往效率低下且成本高昂。預測性維護(Predictive Maintenance, PdM)通過實時監測設備狀態并預測潛在故障,能夠顯著減…

DeepSeek+即夢:AI視頻創作從0到1全突破

目錄 一、開啟 AI 視頻創作大門&#xff1a;前期準備1.1 注冊與登錄1.2 熟悉工具界面1.3 硬件與網絡要求 二、用 DeepSeek 構思視頻腳本2.1 明確創作主題與目標2.2 編寫優質提示詞2.3 生成并優化腳本 三、即夢 AI 實現畫面生成3.1 文生圖基礎操作3.2 調整參數提升畫質3.3 保持人…

初始化列表詳解

1.類中包含以下成員&#xff0c;必須放在初始化列表位置進行初始化&#xff1a; 1. 引用成員變量 2.const成員變量 3. 自定義類型成員(且該類沒有默認構造函數時 ) 2. 成員變量在類中聲明次序就是其在初始化列表中的初始化順序&#xff0c;與其在初始化列表中的先后次序無關…

基于建造者模式的信號量與理解建造者模式

信號量是什么&#xff1f; AI解釋&#xff1a;信號量&#xff08;Semaphore&#xff09;是操作系統中用于 進程同步與互斥 的經典工具&#xff0c;由荷蘭計算機科學家 Edsger Dijkstra 在 1965 年提出。它本質上是一個 非負整數變量&#xff0c;通過原子操作&#xff08;P 操作…

開閉原則(OCP)

非常棒的問題&#xff01;&#x1f50d; 開閉原則&#xff08;OCP, Open/Closed Principle&#xff09;是軟件設計的核心原則之一&#xff0c;下面我將從定義、意義、優劣分析、Python示例和結構圖五個方面完整解析給你。 &#x1f9e0; 什么是開閉原則&#xff1f; 開閉原則&a…

python數據分析(七):Pandas 數據變形與重塑

Pandas 數據變形與重塑全面指南 1. 引言 在數據分析過程中&#xff0c;我們經常需要將數據從一種結構轉換為另一種結構&#xff0c;以適應不同的分析需求。Pandas 提供了豐富的數據變形與重塑功能&#xff0c;包括旋轉(pivot)、堆疊(stack)、融合(melt)等多種操作。本文將詳細…

Android學習總結之jetpack組件間的聯系

在傳統安卓開發中&#xff0c;UI 組件&#xff08;Activity/Fragment&#xff09;常面臨三個核心問題&#xff1a; 生命周期混亂&#xff1a;手動管理 UI 與數據的綁定 / 解綁&#xff0c;易導致內存泄漏&#xff08;如 Activity 銷毀后回調仍在觸發&#xff09;。數據斷層&am…

C++初階:類和對象(二)

大家好&#xff0c;我是小卡皮巴拉 文章目錄 目錄 一.運算符重載 1.1 基本概念 定義 參數規則 特性 選擇原則 重載要點 二.類的默認成員函數 2.1 構造函數 構造函數的特點 2.2 析構函數 析構函數的特點 2.3 拷貝構造函數 拷貝構造的特點 2.4 拷貝賦值運算符重…

【c++】【STL】priority_queue詳解

目錄 priority_queue的作用priority_queue的接口構造函數emptysizetoppushpopswap priority_queue的實現仿函數&#xff08;函數對象&#xff09;是什么&#xff1f;向上調整算法&#xff08;adjustup&#xff09;向下調整算法&#xff08;adjustdown&#xff09;迭代器構造pus…