Python :數據模型

一. 什么是數據模型?

Python數據模型是Python對象系統的抽象,通過一組特殊方法?(如__init____len__等)和協議?(如迭代協議、上下文管理協議),定義了對象如何與語言的內置功能(如len()for循環等)交互。

?核心思想

  • ?統一性:所有對象(如列表、字典、自定義類)的行為都通過相同的特殊方法實現。
  • ?靈活性:通過實現特殊方法,可以讓自定義對象支持內置操作(如+in、切片等)。

例子

import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])
class FrenchDeck:ranks = [str(n) for n in range(2, 11)] + list('JQKA')suits = 'spades diamonds clubs hearts'.split()def __init__(self):self._cards = [Card(rank, suit) for suit in self.suitsfor rank in self.ranks]def __len__(self):return len(self._cards)def __getitem__(self, position):return self._cards[position]
解釋
  1. 模塊導入

    import collections

    導入了 Python 標準庫中的?collections?模塊。

  2. 命名元組定義:Card

    Card = collections.namedtuple('Card', ['rank', 'suit'])

    使用?namedtuple?創建了一個名為?Card?的簡單類,表示撲克牌的一張牌。每個?Card?對象有兩個屬性:

    • rank:表示牌的點數(如?'2',?'J',?'A'?等)。
    • suit:表示牌的花色(如?'spades',?'diamonds'?等)。
  3. 類定義:FrenchDeck

    • 定義了一個名為?FrenchDeck?的類,表示一副標準的 52 張撲克牌。
    • 類屬性:

      ranks = [str(n) for n in range(2, 11)] + list('JQKA') suits = 'spades diamonds clubs hearts'.split()

      • ranks:表示牌的所有點數,包括數字牌('2'?到?'10')和字母牌('J',?'Q',?'K',?'A')。
      • suits:表示牌的所有花色('spades'?黑桃、'diamonds'?方片、'clubs'?梅花、'hearts'?紅心)。
    • 構造函數?__init__

      def __init__(self): self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]

      初始化時創建了一副完整的撲克牌,存儲在?_cards?列表中。通過列表推導式生成所有可能的牌組合。
    • 方法?__len__

      def __len__(self): return len(self._cards)

      實現了特殊方法?__len__,使得可以通過?len(deck)?獲取撲克牌的數量。
    • 方法?__getitem__

      def __getitem__(self, position): return self._cards[position]

      實現了特殊方法?__getitem__,使得可以通過索引訪問撲克牌,例如?deck[0]

常用特殊方法

方法對應操作
__init__對象初始化
__repr__?/?__str__字符串表示
__len__len(obj)
__getitem__obj[key](支持索引和切片)
__iter__for x in obj(迭代)
__enter__?/?__exit__with語句(上下文管理)

迭代協議

實現__iter____next__方法,讓對象支持for循環:

class CountDown:def __init__(self, start):self.current = startdef __iter__(self):return selfdef __next__(self):if self.current <= 0:raise StopIterationelse:self.current -= 1return self.current + 1for num in CountDown(3):print(num)  # 輸出: 3 2 1

?

?解釋
  1. 類定義:CountDown

    • 定義了一個名為?CountDown?的類,用于實現倒計時功能。

    • 構造函數?__init__

      def __init__(self, start): self.current = start

      初始化時接收一個參數?start,表示倒計時的起始值,并將其賦值給實例屬性?self.current

    • 方法?__iter__

      def __iter__(self): return self

      實現了可迭代協議,使得該類的實例可以作為迭代器使用。返回自身(self)。

    • 方法?__next__

      def __next__(self): if self.current <= 0: raise StopIteration else: self.current -= 1 return self.current + 1

      實現了迭代器協議中的?__next__?方法:

      • 如果當前值?self.current?小于或等于 0,則拋出?StopIteration?異常,表示迭代結束。
      • 否則,將?self.current?減 1,并返回減 1 前的值(即當前值)。
  2. 使用場景

    • 該類可以通過?for?循環或手動調用?next()?方法進行倒計時。
    • 示例:
      countdown = CountDown(5)
      for value in countdown:print(value)
      輸出結果:

      5 4 3 2 1

上下文管理協議

實現__enter____exit__方法,支持with語句:

class Timer:def __enter__(self):self.start = time.time()return selfdef __exit__(self, exc_type, exc_val, exc_tb):self.end = time.time()print(f"耗時: {self.end - self.start:.2f}秒")with Timer():time.sleep(1)  # 輸出: 耗時: 1.00秒
?解釋
  1. 類定義:Timer

    • 定義了一個名為?Timer?的類,用于測量代碼塊的執行時間。

    • 方法?__enter__

      def __enter__(self): self.start = time.time() return self

      • 實現了上下文管理協議中的?__enter__?方法。
      • 在進入?with?語句塊時,記錄當前時間(以秒為單位)并存儲在實例屬性?self.start?中。
      • 返回自身(self),以便在?with?語句塊中可以訪問該對象。
    • 方法?__exit__

      def __exit__(self, exc_type, exc_val, exc_tb): self.end = time.time() print(f"耗時: {self.end - self.start:.2f}秒")

      • 實現了上下文管理協議中的?__exit__?方法。
      • 在退出?with?語句塊時,記錄當前時間(以秒為單位)并存儲在實例屬性?self.end?中。
      • 計算執行時間(self.end - self.start),并以兩位小數的格式打印到控制臺。
  2. 使用場景

    • 通過?with?語句使用?Timer?類來測量代碼塊的執行時間。
    • 示例:

      with Timer(): time.sleep(1) # 輸出: 耗時: 1.00秒

      • 在?with?語句塊中調用了?time.sleep(1),模擬了一個耗時 1 秒的操作。
      • Timer?類會自動計算并打印出這段代碼的執行時間。?

讓自定義類支持切片

class MySequence:def __init__(self, data):self.data = datadef __len__(self):return len(self.data)def __getitem__(self, index):if isinstance(index, slice):return self.data[index.start : index.stop : index.step]else:return self.data[index]seq = MySequence([0, 1, 2, 3, 4])
print(seq[1:3])  # [1, 2](支持切片!)

鴨子類型(Duck Typing)?

Python不檢查對象的類型,而是檢查對象是否實現了特定的方法(即是否“像鴨子一樣叫”)。

?示例
class FakeList:def __len__(self):return 10def __getitem__(self, index):return index * 2fake = FakeList()
print(len(fake))       # 10(調用__len__)
print(fake[5])         # 10(調用__getitem__)
print(isinstance(fake, list))  # False,但行為類似列表!

?

?

?

?

?

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

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

相關文章

考研數學非數競賽復習之Stolz定理求解數列極限

在非數類大學生數學競賽中&#xff0c;Stolz定理作為一種強大的工具&#xff0c;經常被用來解決和式數列極限的問題&#xff0c;也被譽為離散版的’洛必達’方法&#xff0c;它提供了一種簡潔而有效的方法&#xff0c;使得原本復雜繁瑣的極限計算過程變得直觀明了。本文&#x…

電商平臺數據高效集成:旺店通旗艦版到MySQL方案解析

旺店通旗艦版-商品信息查詢到MySQL的高效數據集成方案 在現代電商平臺中&#xff0c;數據的高效集成和處理是業務成功的關鍵。本文將分享一個實際案例&#xff0c;展示如何通過輕易云數據集成平臺&#xff0c;將旺店通旗艦奇門的數據無縫對接到MySQL數據庫&#xff0c;實現商品…

ACL初級總結

ACL–訪問控制列表 1.訪問控制 在路由器流量流入或者流出的接口上,匹配流量,然后執行相應動作 permit允許 deny拒絕 2.抓取感興趣流 3.ACL匹配規則 自上而下逐一匹配,若匹配到了則按照對應規則執行動作,而不再向下繼續匹配 思科:ACL列表末尾隱含一條拒絕所有的規則 華為:AC…

【微知】plantuml在泳道圖中如何將多個泳道框起來分組并且設置顏色?(box “瀏覽器“ #LightGreen endbox)

泳道分組并且著色 分組用 box和endbox &#xff0c;顏色用#xxx&#xff0c;標注用"xxx" box "瀏覽器" #LightGreen participant "瀏覽器1" as Browser participant "瀏覽器2" as Browser2 endboxparticipant "服務端" as …

C語言:計算并輸出三個整數的最大值 并對三個數排序

這是《C語言程序設計》73頁的思考題。下面分享自己的思路和代碼 思路&#xff1a; 代碼&#xff1a; #include <stdio.h> int main() {int a,b,c,max,min,mid ; //設置大中小的數分別為max&#xff0c;mid&#xff0c;min&#xff0c;abc為輸入的三個數printf("ple…

【PyMySQL】Python操作MySQL

1、安裝pymysql pip install pymysql2、導包 import pymysql3、連接MySQL數據庫 db pymysql.connect(hostlocalhost # 本地localhost&#xff0c;或服務器IP地址,userroot # 用戶名,passwordpassword # 密碼,databasemysql) #數據庫名4、創建游標 cursor db.cursor()5、增…

藍橋備賽(18)- 紅黑樹和 set 與 map(上)

對于二叉搜索樹 &#xff0c; 平衡二叉樹 &#xff0c; 以及紅黑樹 &#xff0c; 目前只需要了解背后的原理 &#xff0c; 不做代碼實現的要求 &#xff0c; 重要的就是了解各種操作的時間復雜度即可 &#xff0c; 為set 與 map 做鋪墊 一、二叉搜索樹 1.1 基本概念 相較與于堆…

【Synchronized】不同的使用場景和案例

【Synchronized】不同的使用場景和案例 【一】鎖的作用范圍與鎖對象【1】實例方法&#xff08;對象鎖&#xff09;【2】靜態方法&#xff08;類鎖&#xff09;【3】代碼塊&#xff08;顯式指定鎖對象&#xff09;【4】類鎖&#xff08;通過Class對象顯式鎖定&#xff09; 【二】…

大模型在原發性急性閉角型青光眼預測及治療方案制定中的應用研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與方法 1.3 國內外研究現狀 二、原發性急性閉角型青光眼概述 2.1 疾病定義與分類 2.2 發病機制與危險因素 2.3 癥狀與診斷方法 三、大模型在原發性急性閉角型青光眼預測中的應用 3.1 大模型原理與優勢 3.2 術前風險預…

【藍橋杯—單片機】第十五屆省賽真題代碼題解析 | 思路整理

第十五屆省賽真題代碼題解析 前言賽題代碼思路筆記競賽板配置建立模板明確基本要求顯示功能部分頻率界面正常顯示高位熄滅 參數界面基礎寫法&#xff1a;兩個界面分開來寫優化寫法&#xff1a;兩個界面合一起寫 時間界面回顯界面校準校準過程校準錯誤顯示 DAC輸出部分按鍵功能部…

Vue3實戰學習(Vue3快速搭建后臺管理系統(網頁頭部、側邊導航欄、主體數據展示區的設計與實現)(超詳細))(9)

目錄 一、Vue3工程環境配置、項目基礎腳手架搭建、Vue3基礎語法、Vue3集成Element-Plus的詳細教程。(博客鏈接如下) 二、Vue3集成Element-Plus詳細教程。(博客鏈接如下) 三、Vue3集成Vue-Router詳細教程。(博客鏈接如下) 四、Vue3快速搭建后臺管理系統。(實戰學習) &#xff08…

halcon機器人視覺(四)calibrate_hand_eye_stationary_3d_sensor

目錄 一、準備數據和模型二、按照表面匹配的的結果進行手眼標定三、根據標定結果計算CalObjInCamPose一、準備數據和模型 1、讀3D模型:read_object_model_3d 2、創建表面匹配模板:create_surface_model 3、創建一個HALCON校準數據模型:create_calib_data read_object_mode…

【菜鳥飛】通過vsCode用python訪問deepseek-r1等模型

目標 通過vsCode用python訪問deepseek。 環境準備 沒有環境的&#xff0c;vscode環境準備請參考之前的文章&#xff0c;另外需安裝ollama&#xff1a; 【菜鳥飛】用vsCode搭建python運行環境-CSDN博客 AI入門1&#xff1a;AI模型管家婆ollama的安裝和使用-CSDN博客 選讀文章…

vue中,watch里,this為undefined的兩種解決辦法

提示&#xff1a;vue中&#xff0c;watch里&#xff0c;this為undefined的兩種解決辦法 文章目錄 [TOC](文章目錄) 前言一、問題二、方法1——使用function函數代替箭頭函數()>{}三、方法2——使用that總結 前言 ?????盡量使用方法1——使用function函數代替箭頭函數()…

【如何使用云服務器與API搭建專屬聊天系統:寶塔面板 + Openwebui 完整教程】

文章目錄 不挑電腦、不用技術&#xff0c;云服務器 API 輕松搭建專屬聊天系統&#xff0c;對接 200 模型&#xff0c;數據全在自己服務器&#xff0c;安全超高一、前置準備&#xff1a;3 分鐘快速上手指南云服務器準備相關賬號注冊 二、手把手部署教程&#xff08;含代碼塊&a…

使用 PresentMon 獲取屏幕幀率

PresentMon是一個用于捕獲和分析Windows上圖形應用程序高性能特性的工具集,最初由GameTechDev開發,現由英特爾維護和推廣。PresentMon能夠追蹤關鍵性能指標,如CPU、GPU和顯示器的幀持續時間和延遲等,并支持多種圖形API(如DirectX、OpenGL和Vulkan)以及不同的硬件配置和桌…

基金交易系統的流程

1. 賬戶管理 開戶&#xff1a;投資者在基金銷售機構&#xff08;如銀行、券商或第三方平臺&#xff09;開立基金賬戶和資金賬戶。賬戶驗證&#xff1a;驗證投資者身份&#xff0c;綁定銀行卡或其他支付方式。 2. 交易申請 投資者下單&#xff1a;通過交易終端&#xff08;APP…

vue2雙向綁定解析

Vue 2 的雙向綁定原理基于 Object.defineProperty&#xff0c;核心源碼在 src/core/observer 目錄中。 1. 核心模塊&#xff1a;observer observer 模塊負責將普通對象轉換為響應式對象&#xff0c;主要包括以下文件&#xff1a; index.js&#xff1a;定義 Observer 類&#…

中級軟件設計師2004-2024軟考真題合集下載

中級軟件設計師2004-2024軟考真題合集下載 &#x1f31f; 資源亮點&#x1f3af; 適用人群&#x1f4a1; 資源使用指南&#x1f4cc; 資源獲取方式 &#x1f31f; 資源亮點 「中級軟件設計師歷年真題及答案解析&#xff08;2004-2024&#xff09;」 是全網最全、最新的備考資料…

艾爾登復刻Ep1——客戶端制作、場景切換、網絡控制

需要添加的插件內容 Netcode for GameObjects&#xff1a;是一個為 Unity 游戲開發提供高級網絡功能的 SDK。它的主要作用是允許開發者在其 GameObject 和 MonoBehaviour 工作流中集成網絡功能&#xff0c;并且可以與多種底層傳輸層協議兼容。 具體內容請看&#xff1a;https:…