python中使用自定義類例項作為字典的key

2022-09-01 22:06:37 字數 1545 閱讀 6331

python中dict型別的key值要求是不可變型別,通常來說,我們一般採用int或者str型別來作為字典的key,但是在某些場景中,會造成一定的麻煩。

如我們有乙個處理http request的規則類名為rule,其定義如下,它由乙個request path和其支援的request methods陣列組成:

class

rule(object):

def__init__

(self, path, methods):

assert

(isinstance(path, str))

assert

(isinstance(methods, list))

self.path =path

self.methods = [method.upper() for method in methods]

現在我們想為每一種rule(非每乙個rule例項)關聯乙個對應的handler物件,使用乙個dict來儲存對應關係。

r1 = rule("

/index

", ["

get"

])r2 = rule("

/index

", ["

get"

])d =

print

d[r2]

#兩個不同的物件,列印出none

r1和r2雖然是兩個不同的物件例項,但是在業務邏輯上是一致的,因此如果我們想讓兩個在邏輯上一致的物件被認為是同乙個key,可以通過一些手段達到這個效果。

為rule新增兩個方法__hash__和__eq__,其意義可以檢視python官方文件。

class

rule(object):

def__init__

(self, path, methods):

assert

(isinstance(path, str))

assert

(isinstance(methods, list))

self.path =path

self.methods = [method.upper() for method in

methods]

def__hash__

(self):

return

hash((self.path, str(self.methods)))

def__eq__

(self, other):

return (self.path, self.methods) == (other.path, other.methods)

然後再執行一下上面的測試**,發現可以順利取到handler了:

r1 = rule("

/index

", ["

get"

])r2 = rule("

/index

", ["

get"

])d =

print d[r2] == handler#

列印出true

在MFC中使用自定義視窗類

1 在 wndclass wc wc.cbcl tra 0 wc.cbwndextra 0 wc.hbrbackground hbrush getstockobject white brush wc.hcursor loadcursor idc arrow wc.hicon null wc.hins...

python自定義類

設計乙個person類的3種方式 1 使用內建型別list person mike 23,male 0 姓名,1 年紀,2 性別 print person 0 person 1 person 2 2 使用字典型別dic person1 person2 print person1 name perso...

Python自定義元類的例項講解

乙個類沒有宣告自己的元類,預設他的元類就是type,除了使用元程式設計客棧類type,使用者也可以通程式設計客棧過繼承type來自定義元類。我們可以使用類屬性 metaclass 把乙個類的建立過程,轉交給其它地方。class a object metaclass 這個類的建立轉交給其他地方 pas...