比較python類的兩個instance(對象) 是否相等

http://www.yihaomen.com/article/python/281.htm

?

比較python類的兩個instance(對象) 是否相等

對于同一個Class,可以創建不同的實例(instance), 如何比較這兩個 instance 是否相等呢?我們知道,對于計算機來說,要判斷兩個對象是否相等,就是看在內存中的地址是否同一個。如果內存地址一樣,那么肯定是相等的。這種情況通常出現在一個對象是另外一個對象的引用時出現。
但在實際的開發過程中,要比較兩個對象是否相等,并不是通過內存地址來判斷的,而是通過這兩個對象的部分屬性值,或者全部屬性值來對比判斷的。
假設有一個職員Class, 我們分別創建了兩個對象
程序代碼?程序代碼

class Staff(object):
????def __init__(self,id,name,sex):
????????self.id=id
????????self.name=name
????????self.sex=sex

我們這樣認為,如果id 相同,則表示兩個對象相等,id姑且表示身份證編號吧,如果身份證編號相同,那么肯定是同一人,在實際的項目中會遇到這樣的情況。
創建對象并查看各自的內存地址
程序代碼?程序代碼

staff1=Staff("123456","張三","男")
staff2=Staff("123456","李四","女")
print id(staff1),id(staff2)
#12327248 12327184

結果很明顯,在不同的內存地址,這時候如果判斷 staff1==staff2 ,結果肯定是??False。

如何滿足我們的需要,只要id 相同的對象,就認為是相等的對象呢,有如下幾種方法:
一.重載 Staff Class 的 __eq__ 方法
程序代碼?程序代碼

class Staff(object):
????def __init__(self,id,name,sex):
????????self.id=id
????????self.name=name
????????self.sex=sex
????????
????def __eq__(self,other):
????????return self.id==other.id?

staff1=Staff("123456","張三","男")
staff2=Staff("123456","李四","女")
print id(staff1),id(staff2)
print staff1==staff2
#True

結果返回為 true,說明是相等的,但在計算機中的內存地址,肯定是不一樣的。這里重載了__eq__方法,當然你還可以 增加比較條件,例子中只對比了id. 用同樣的方法,還可以實現 兩個對象相加等操作,重載__add__ 方法。

2.直接屬性值對比來實現
程序代碼?程序代碼

staff1=Staff("123456","張三","男")
staff2=Staff("123456","李四","女")
print id(staff1),id(staff2)
????
print staff1.__dict__
print staff2.__dict__
????
if staff1.__dict__['id']==staff2.__dict__['id']:
??????print 'yes,equal'

你會發現,這樣也是可以的,同樣也可以對比多個屬性,這里的重點是用到了python Class 的 __dict__系統內置方法來實現。?

轉載于:https://www.cnblogs.com/saolv/p/9839626.html

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

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

相關文章

Mybaits插入記錄返回主鍵值

某些情況進行insert時不知道主鍵值(主鍵為自增),例如系統新增用戶時,有用戶序號(主鍵 自增),用戶名,密碼。插入時只需插入用戶名和密碼,之后取得mysql自增的序號。 如下為…

Mac 解決brew一直卡在Updating Homebrew

運行命令brew install node,結果界面一直卡在Updating Homebrew...上,有兩種解決辦法 方法一:直接關閉brew每次執行命令時的自動更新(推薦) vim ~/.bash_profile# 新增一行 export HOMEBREW_NO_AUTO_UPDATEtrue方法二…

CAS單點登錄原理簡單介紹

1. SSO簡介 1.1 單點登錄定義 單點登錄(Single sign on),英文名稱縮寫SSO,SSO的意思就是在多系統的環境中,登錄單方系統,就可以在不用再次登錄的情況下訪問相關受信任的系統。也就是說只要登錄一次單體系統就可以。計劃在項目中加…

前端跨域通信的幾種方式

前言 前端通信類的問題,主要包括以下內容: 1、什么是同源策略及限制 同源策略是一個概念,就一句話。有什么限制,就三句話。能說出來即可。 2、前后端如何通信 如果你不準備,估計也就只能說出ajax。 3、如何創建Aja…

T4((Text Template Transformation Toolkit))模版引擎之基礎入門 C#中文本模板(.tt)的應用...

1 關于C#中文本模板(.tt)的簡單應用https://blog.csdn.net/zunguitiancheng/article/details/78011145 任何一個傻瓜都能寫出計算機能理解的程序,而優秀的程序員卻能寫出別人能讀得懂的程序。—— Martin Fowler 2 T4模版引擎之生成數據庫實體類 http://www.cnblogs…

LeetCode412Fizz Buzz

寫一個程序,輸出從 1 到 n 數字的字符串表示。 1. 如果 n 是3的倍數,輸出“Fizz”; 2. 如果 n 是5的倍數,輸出“Buzz”; 3.如果 n 同時是3和5的倍數,輸出 “FizzBuzz”。 示例: n 15, 返回: [ …

vue+node實現中間層同步調用接口

為了應對業務的復雜性,提高前端的渲染能力,故在項目中引入nodejs做中間層,前端承接vue,后端對接Java。 至于為什么這么搞,網上有好多文章都在討論,可以說仁者見仁智者見智,這里我們不在深究。 …

ES6學習筆記(二十二)ArrayBuffer

ArrayBuffer ArrayBuffer對象、TypedArray視圖和DataView視圖是 JavaScript 操作二進制數據的一個接口。它們都是以數組的語法處理二進制數據,所以統稱為二進制數組。 二進制數組由三類對象組成。 (1)ArrayBuffer對象: 代表內存之…

如何正確地使用Java的@deprecated標注

沒有什么事情比看到一個沒有任何說明的deprecated標注更讓人憤怒的事情了。這種做法只能讓人困惑,我到底還要不要用這個已經‘廢棄’的方法?如果開發者不希望某個方法再被人用的話,就要好好地為deprecated標注寫說明。這篇文章就討論了正確地…

實現div里的img圖片水平垂直居中

body結構 <body><div><img src"1.jpg" alt"haha"></div> </body>方法一&#xff1a; 將display設置成table-cell&#xff0c;然后水平居中設置text-align為center&#xff0c;垂直居中設置vertical-align為middle。 <…

[ 懶人神器 ] —— OO一鍵build:.zip - .jar

懶人神器 更新 大家注意一下&#xff0c;由于在寫入MANIFEST的時候&#xff0c;Class-Path路徑給的是 ../lib &#xff0c;即上級目錄的lib。 所以在對拍時如果手動移動了 jar包的位置&#xff0c;需要保證 lib/ 文件夾在存放jar包的上一級目錄下&#xff0c;否則在運行時會報錯…

實現Datagrid分頁

Html頁面&#xff1a; <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title></title><meta charset"utf-8" /><!-- 引入相關CSS --><…

Luogu 3698 [CQOI2017]小Q的棋盤

BZOJ 4813 雖然數據范圍很迷人&#xff0c;但是想樹形$dp$沒有前途。 先發現一個事情&#xff0c;就是我們可以先選擇一條鏈&#xff0c;最后要走到這一條鏈上不回來&#xff0c;走到鏈上的點每一個只需要一步&#xff0c;而如果要走這條鏈之外的點&#xff0c;一個點需要走兩步…

h5-plus.webview

這里是鏈接轉載于:https://www.cnblogs.com/yuners/p/10721163.html

解決vue打包后靜態資源路徑錯誤的問題

vue項目完成的最后一步就是打包部署上線&#xff0c;但是打包部署的過程往往不是那么一帆風順的&#xff0c;現將遇到問題和解決方案記錄如下。 圖片路徑問題 起因&#xff1a; 頁面中引入資源的方式往往有如下幾種 * HTML標簽中直接引入圖片&#xff0c; 如 <img src&qu…

SQL語句01

SQL(Structured Query Language)&#xff1a;結構化查詢語言SQL分類&#xff1a; 數據操縱語言DML&#xff08;Data Manipulation Language&#xff09; SELECT INSERT UPDATE DELETE 數據定義語言DDL&#xff08;Data definition language&#xff09; …

mongoose 筆記

快速啟動 首先需要安裝MongoDB和Node.js。 然后使用npm下載mongoose&#xff1a; npm install mongoose 接著我們直接在項目中引入mongoose&#xff0c;并且連接數據庫就會在本地運行 MongoDB了&#xff1a; // index.js var mongoose require(mongoose); mongoose.connect(…

前端DES加密

1、下載crypto.js文件庫 https://github.com/brix/crypto-js/releases 2、引入文件 <script type"text/javascript" src"js/jquery.min.js"></script> <script src"js/rollups/tripledes.js"></script> <script src&…

DOMBOM(source、methods、contents、Application)

何為DOM&#xff1f; Document Object Model Dom&#xff0c;是W3C組織推薦的處理可擴展標志語言的標準編程接口。在網頁上&#xff0c;組織頁面的對象被組織在一個樹形結構中&#xff0c;用來表示文檔中對象的標準模型就稱為DOM。 可以認為DOM是頁面上數據和結構的一個樹形表示…

sublime 無法下載插件解決辦法(親測有效)

最近發現sublime裝不到插件 只需要在Preferences > Package Settings > Package Control > Settings - User頁面加上以下代碼即可&#xff1a; "channels":["https://erhan.in/channel_v3.json"]上述頻道親測有效&#xff0c;如果還不能使用的小…