1. 程式人生 > >Python:hashable協議

Python:hashable協議

#!/usr/bin/env python
# coding:UTF-8


"""
@version: python3.x
@author:曹新健
@contact: [email protected]
@software: PyCharm
@file: hashable協議.py
@time: 2018/11/6 13:48
"""

"""
1、一個物件能被稱為hashable(可雜湊運算的),它必須有個hash值(雜湊值),這個值在整個執行時刻均不會變化,
   而且必須可以進行相等比較。具體來說,一個物件能被稱為hashable,它必須實現__hash__()與__eq__()方法。
2、可以對一個物件使用hash()獲取hash值
3、對於python內建類,建立之後狀態就無法變動的型別,它的例項都是hashable,而可變動型別的例項都是
   unhashable型別
4、一個自定義的類建立的例項預設也是hashable的,其__hash__()的實現基本上根據id()計算而來,而__eq__()
   的實現預設使用is來比較,因此兩個分別建立的例項hash()值必然不同,而且相等性對比一定不成立。
5、很多時候自定義類預設hashable並不合適,比如自定義座標例項p1=(1,2,3)和p2=(1,2,3),預設情況下這兩個實
   例不相等,實際上代表同一個座標。所以需要自定義__hash__()與__eq__()方法。
6、當集合判斷新加入的物件與已經包含的某個物件hash值相同,而且相等性比較也成立時,就會丟棄已包含的物件,
   並將新的物件加入。
7、集合判斷是否重複是在物件加入時,當物件已經在集合中了,我們又用其他方式改變了物件狀態,就會造成集合
   資料重複,所以hashable要求物件建議狀態不可變動,必要時,加一些存取限制。
8、兩個物件若相等性比較成立,那麼也必須有相同的hash值,然而hash值相同,兩個物件的相等性比較不一定是成
   立的。
"""

class Point:
    def __init__(self,x,y,z):
        self.x = x
        self.y = y
        self.z = z

    def __hash__(self):
        return 100 * self.z + 10 * self.y + self.x

    def __eq__(self, other):
        if hasattr(other,"x") and hasattr(other,"y") and hasattr(other,"z"):
            return self.x == other.x and self.y == other.y and self.z == other.z
        return False

    def __str__(self):
        return "Point({x},{y},{z})".format(**vars(self))

    def __repr__(self):
        return self.__str__()

if __name__ == "__main__":
    p1 = Point(1,2,3)
    p2 = Point(3,3,3)
    p3 = Point(1,2,3)
    pset = {p1,p2,p3}
    print(pset)     #列印{Point(1,2,3), Point(3,3,3)}
    p2.x = 1
    p2.y = 2
    print(pset)     #列印{Point(1,2,3), Point(1,2,3)}

相關推薦

Pythonhashable協議

#!/usr/bin/env python # coding:UTF-8 """ @version: python3.x @author:曹新健 @contact: [email protected] @software: PyCharm @file: hash

Pythonorderable協議

#!/usr/bin/env python # coding:UTF-8 """ @version: python3.x @author:曹新健 @contact: [email protected] @software: PyCharm @file: orde

Python爬蟲HTTP協議、Requests庫

.org clas python爬蟲 print 通用 娛樂 信息 傳輸協議 介紹 HTTP協議: HTTP(Hypertext Transfer Protocol):即超文本傳輸協議。URL是通過HTTP協議存取資源的Internet路徑,一個URL對應一個數據資源。

python接口自動化測試一http協議

連接 -- lencod 本機 新的 ext 種類 默認 nec 1、 http簡介:http(超文本傳輸協議)是一個基於請求與響應模式的、無狀態的、應用層的協議 2、 url詳解:百度搜索的一個url地址:https://www.baidu.com/s?wd=%E4

python 通過udp協議實現客戶端與服務端的互動

(1)服務端 建立socket 繫結目的ip和埠號、 資料互動 import socket udpSer = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #這裡的SOCK_DGRAM 為udp流 udpSe

python應用系列教程——python使用smtp協議傳送郵件html文字郵件、圖片郵件、檔案附件郵件

全棧工程師開發手冊 (作者:欒鵬) python使用smtp協議傳送電子郵件。包含傳送html文字郵件、包含圖片附件的郵件,包含其他檔案附件的郵件。可設定郵件的收發人,主題,內容。並以163郵件為例,分別在python2.7和python3.6下進行試驗。

python使用udp協議傳送飛秋訊息

#coding:utf-8 import socket for i in range(200): sock =socket.socket(socket.AF_INET,socket.SOCK_DG

產品經理學Python參數傳遞方式

暫時 ace 微信公眾 聯網 替代 strong 變參 lose 創建刪除 這是關於Python的第5篇文章,主要介紹下參數傳遞方式和如何設計自己的函數。 (一) 本篇主要介紹2種參數傳遞方式。 位置參數 調用函數時,根據函數定義的參數位置來傳遞參數。 1 def rig

python類2——有關類和對象的BIF內置函數

subclass 提前 變量 類和對象 ins peer 設置 clas 需要 1、檢查、判斷 issubclass(class, classinfo)如果第一個參數是第二個參數的子類,返回true,註意: 非嚴格(自己可以認為是自己的子類); 第二個參數可以是由多個cl

python爬蟲0

電驢 cati body nbsp 爬蟲 esp 域名 對象 通過 什麽是網頁爬蟲,也叫網頁蜘蛛。把互聯網比作一個蜘蛛網,有好多節點,這個蜘蛛在網上爬來爬去,對對網頁中的每個關鍵字進行建立索引,然後建立索引數據庫,經過復雜的排序算法後,這些算法的結果將按照相關度的高低展現出

python正則1

itl .com fis 使用 pos clas nbsp com 正則表達式 魚c(擴展閱讀): Python3 如何優雅地使用正則表達式(詳解一) Python3 如何優雅地使用正則表達式(詳解二) Python3 如何優雅地使用正則表達式(詳解三) Python3 如

python將numpy數組寫入csv文件

port tor cto imp span bsp pan logs txt 1 import numpy as np 2 np.savetxt(‘E:\\forpython\\featvector.csv‘,data_to_save,delimiter=‘,‘) p

python類5——Python 的類的下劃線命名有什麽不同?

以及 mod 導入 類成員 部分 span 子類 內部函數 默認 首先是單下劃線開頭,這個被常用於模塊中,在一個模塊中以單下劃線開頭的變量和函數被默認當作內部函數,如果使用 from a_module import * 導入時,這部分變量和函數不會被導入。不過值得註意的

python網絡爬蟲的學習筆記

估計 mage codec 課程 不能 nic str utf mas 如果要爬取的內容嵌在網頁源代碼中的話,直接下載網頁源代碼再利用正則表達式來尋找就ok了。下面是個簡單的例子: 1 import urllib.request 2 3 html = urllib.re

Python集合、函數、三元運算符

filename pri other mod 接收參數 系統 != lee 多個參數 集合: #一種數據類型,有去重的功能,無序的(不能根據下標取值) 兩種定義集合方法: 1:先定義一個列表,然後通過強制類型轉換成集合 a=[1,2,3,4,4,5] #set(a) 強制

Python Pandas的DataFrame如何按指定list排序

不同 需求 per log title 表示 anr lac 使用 本文首發於微信公眾號“Python數據之道”(ID:PyDataRoad) 前言 寫這篇文章的起由是有一天微信上一位朋友問到一個問題,問題大體意思概述如下: 現

分針網——每日分享HTTP協議理解與應用總結

http 應用總結 領取免費IT資料 加群:272292492 更多文章:www.f-z.cn Request & Response Re

PythonAnaconda安裝虛擬環境到指定路徑

rdquo oat otto 環境 wim uri blog target images 1 曾經的困擾 有段時間,想使用基於不同python版本的anaconda,就直接從官網下載了兩個不同的anaconda版本進行安裝。剛開始的時候,還覺得也沒啥問題。用了一小

pythonprint含有中文的list

replace imp itl print ins 中文 lis base git Python 的 List 如果有中文的話, 會印出 \xe4\xb8... 等等的編碼(如下所示), 要如何印出中文呢? >>> a = [‘中文‘, ‘ab‘]&g

NS3網絡仿真(12) ICMPv4協議

normal fun rac sequence icmp veh abcde all protoc 快樂蝦http://blog.csdn.net/lights_joy/歡迎轉載,但請保留作者信息ICMP的全稱是 Internet ControlMessage Prot