使用Mix-in類組合功能

為什么需要Mix-in?

在學習面向對象時我們知道,類可以通過繼承類獲得屬性和方法,通過繼承可以減少重復代碼、提高復用率。Python支持多繼承,一個類可以通過繼承多個類來得到它們的功能。但多繼承會帶來一些問題,比如屬性沖突。那么有沒有可能只繼承類的方法呢?

當然方法名稱也可能沖突。但如果合理地劃分功能的話,這種可能性很小。

Mix-in類(混入類):只定義一些方法給子類使用,不定義自己的實例屬性,也不要求調用它的__init__方法。Mix-in類并不是新的語法,只是一種特殊的類,只用來提供方法。

在實際的代碼中,我們經常會看到Mixin結尾的類(如SingleObjectMixin),這是一種命名約定,名稱其實不會影響功能。

Mix-in 實例

這里借用 通過 Python 理解 Mixin 概念舉的例子。

class MappingMixin:def __getitem__(self, key):return self.__dict__.get(key)def __setitem__(self, key, value):return self.__dict__.set(key, value)class Person(MappingMixin):def __init__(self, name, gender, age):self.name = nameself.gender = genderself.age = agep = Person("小陳", "男", 18)
print(p['name'])  # "小陳"
print(p['age'])  # 18

首先定義了一個Person類,然后我們能用字典訪問Person,于是定義了一個只有方法的MappingMixin類,并讓Person繼承MappingMixin的方法。

另一個例子 python 中Mixin混入類的用法:

class Tel:def telfunc(self):print("我可以接打電話")
?
?
class SMS:def smsfunc(self):print("我可以發短信")
?
?
class Phone(Tel, SMS):def __init__(self, sn):self.sn = sn
?def welcome(self):print("welcome {}".format(self.sn))
?
?
p = Phone("xiaomi")
p.telfunc()
p.smsfunc()
p.welcome()

Django中的Mix-in

Django中有很多Mixin類。在django.views.generic.base 中存在如下關系:
django.views.generic.base
View 是一個基類(可以說是一個抽象基類),實現了核心功能如dispatchdispatch委托具體子類的處理方法。
TemplateResponseMixin 為使用模板的視圖提供了功能。

RedirectView類只繼承 View,可以看到,它實現了 getheadpost 等方法。
TemplateView 只用于顯示內容,因此它只實現了 get 方法。由于它需要相關的模板功能,所以繼承了TemplateResponseMixin

Django中很多實現都依賴了Mix-in類,而我們在使用Django開發的時候,也可以利用(內置的和自定義的)Mix-in類提供功能。
django mixin文檔

參考鏈接

  1. 通過 Python 理解 Mixin 概念
  2. python 中Mixin混入類的用法
  3. 《流暢的Python》第12章:繼承的優缺點
  4. 《Effective Python》(第二版)41.考慮使用Mix-in Classes組合功能
  5. django mixin文檔

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

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

相關文章

鏈表之第一回

歡迎來到我的:世界 收錄專欄:鏈表 希望作者的文章對你有所幫助,有不足的地方還請指正,大家一起學習交流 ! 目錄 前言第一題:刪除鏈表的倒數第n個節點第二題:鏈表的中間結點第三題:合并兩個排序…

如何在 iOS 上安裝并使用 ONLYOFFICE 文檔

借助 iOS 版文檔應用,您可在移動端設備上訪問存儲于 ONLYOFFICE 賬戶中的文件,查看和編輯現有文本文檔、電子表格和演示文稿,創建新文檔并對其進行整理,以及連接第三方云存儲服務。您可與其他門戶網站用戶協作編輯文檔&#xff0c…

數據結構-棧和隊列

目錄 棧的概念 棧的使用 ?編輯 模擬實現棧 中綴表達式轉后綴表達式 括號匹配 出棧入棧次序匹配 隊列概念 隊列的使用 棧的概念 棧是一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素的操作.進行數據插入和刪除操作的一端稱為棧頂,;另一端稱為棧底.棧中的數據…

【Vue-Router】嵌套路由

footer.vue <template><div><router-view></router-view><hr><h1>我是父路由</h1><div><router-link to"/user">Login</router-link><router-link to"/user/reg" style"margin-left…

面試攻略,Java 基礎面試 100 問(十五)

final, finally, finalize 的區別? final&#xff1a;修飾符&#xff08;關鍵字&#xff09;有三種用法&#xff1a;如果一個類被聲明為 final&#xff0c;意味著它不能再派生出新的子類&#xff0c;即不能被繼承&#xff0c;因此它和 abstract 是反義詞。將變量聲明為 final…

動手學DL——MLP多層感知機【深度學習】【PyTorch】

文章目錄 4、多層感知機&#xff08; MLP&#xff09;4.1、多層感知機4.1.1、隱層4.1.2、激活函數 σ 4.2、從零實現多層感知機4.3、簡單實現多層感知機4.4、模型選擇、欠擬合、過擬合4.5、權重衰退4.6、丟失法|暫退法&#xff08;Dropout&#xff09;4.6.1、dropout 函數實現4…

大數據--難點--地圖的制作

地圖一直是亮點也是難點&#xff0c;剛剛進公司的時候也很難懂~~做出來的也很難看 純CSS3使用vw和vh視口單位實現h5頁面自適應&#xff0c;gulp自動監聽sass改動并保存到css中 當修改了sass里面的代碼后&#xff0c;gulp會自動監聽修改內容并同名保存到css文件夾中&#xff0…

C#字符串占位符替換

using System;namespace myprog {class test{static void Main(string[] args){string str1 string.Format("{0}今年{1}歲&#xff0c;身高{2}cm&#xff0c;月收入{3}元&#xff1b;", "小李", 23, 177, 5000);Console.WriteLine(str1);Console.ReadKey(…

02-C++數據類型-高級

數據類型-高級 4、復合類型 4.4、結構簡介 struct inflatable {char name[20];float vol;double price; };inflatable vincent; //C struct inflatable goose; //C例子 // structur.cpp -- a simple structure #include <iostream> struct inflatable // structu…

B057-spring增強 依賴注入 AOP 代理模式 創建Bean

目錄 AOP概念代理模式引出AOP實現方式xml方式實現注解方式實現 AOP 概念 事務管理&#xff1a;比如可以抽取try catch的重復代碼 日志監控&#xff1a;比如業務邏輯前后打印關于當前訂單數量的日志&#xff0c;了解業務做了什么 性能監控&#xff1a;比如業務前后打印時間&…

浪潮信息趙帥:多元算力時代 開源開放的OpenBMC成為服務器管理優先解

“多元算力時代下&#xff0c;大規模的異構服務器設備面臨多種處理器架構、多種設備協議、不同管理芯片兼容的系統化設計挑戰&#xff0c;管理固件也迎來新的變革。開源開放的OpenBMC&#xff0c;以創新的分層解耦軟件架構&#xff0c;兼容不同處理器架構、算力平臺和管理芯片&…

人流目標跟蹤pyqt界面_v5_deepsort

直接上效果圖 代碼倉庫和視頻演示b站視頻006期&#xff1a; 到此一游7758258的個人空間-到此一游7758258個人主頁-嗶哩嗶哩視頻 代碼展示&#xff1a; YOLOv5 DeepSORT介紹 YOLOv5 DeepSORT是一個結合了YOLOv5和DeepSORT算法的目標檢測與多目標跟蹤系統。讓我為您詳細解釋一…

【字典學習+稀疏編碼Sparse Encoding】簡單介紹與sklearn的實現方式

文章目錄 1、字典學習與稀疏編碼2、sklearn的實現3、示例 1、字典學習與稀疏編碼 簡單來說&#xff0c;稀疏編碼就是把輸入向量&#xff08;信號&#xff09;/ 矩陣&#xff08;圖像&#xff09;表示為稀疏的系數向量和一組超完備基向量&#xff08;字典&#xff09;的線性組合…

vim打開文件中文是亂碼

vim打開文件中文是亂碼 問題&#xff1a;在Linux系統下&#xff0c;使用cat查看含有中文的文本文件正常&#xff0c;但是使用vim打開卻是亂碼 解決方法&#xff1a; 方法一&#xff1a; 在文件中設定 在vim的退出模式下 :set encodingutf8 方法二&#xff1a; 直接寫入/etc/…

ASP.NET WEB API通過SugarSql連接MySQL數據庫

注意&#xff1a;VS2022企業版可以&#xff0c;社區版可能存在問題。實體名稱和字段和數據庫中的要一致。 1、創建項目&#xff0c;安裝SqlSugarCore、Pomelo.EntityFrameworkCore.MySql插件 2、文件結構 2、appsettings.json { “Logging”: { “LogLevel”: { “Default”: …

Ubuntu 軟件依賴出錯處理

現象&#xff1a; apt-get install vim 正在讀取軟件包列表... 完成 正在分析軟件包的依賴關系樹 正在讀取狀態信息... 完成 您可能需要運行“apt-get -f install”來糾正下列錯誤&#xff1a; 下列軟件包有未滿足的依賴關系&#xff1a; cuttlefish-base : 依賴: f2fs-tools…

DG故障切換及DG Broker失效配置清理

DG故障切換及DG Broker失效配置清理 DG故障強制切主DG Broker原有配置清理 DG故障強制切主 主庫發生故障無法在短時間內恢復時&#xff0c;需要執行主備切換。此時由于DG Broker無法連接到主庫&#xff0c;故不能通過Broker切換&#xff0c;只能手動在備庫進行切主。 --斷開備…

Neo4j之MERGE基礎

在 Neo4j 中&#xff0c;MERGE 語句用于根據指定的模式進行創建或匹配節點和關系。它可以在節點或關系不存在時創建它們&#xff0c;并在已存在時進行匹配。 創建或匹配節點&#xff1a; MERGE (p:Person {name: John});這個查詢會檢查是否已經存在一個具有 "Person&quo…

搭建WebDAV服務手機ES文件瀏覽器遠程訪問

文章目錄 1. 安裝啟用WebDAV2. 安裝cpolar3. 配置公網訪問地址4. 公網測試連接5. 固定連接公網地址6. 使用固定地址測試連接 有時候我們想通過移動設備訪問群暉NAS 中的文件,以滿足特殊需求,我們在群輝中開啟WebDav服務,結合cpolar內網工具生成的公網地址,通過移動客戶端ES文件…

【LeetCode 算法】Find And Replace in String 字符串中的查找與替換-排序模擬

文章目錄 Find And Replace in String 字符串中的查找與替換問題描述&#xff1a;分析代碼排序模擬 Tag Find And Replace in String 字符串中的查找與替換 問題描述&#xff1a; 你會得到一個字符串 s (索引從 0 開始)&#xff0c;你必須對它執行 k 個替換操作。替換操作以三…