python中dict型別的key值要求是不可變型別,通常來說,我們一般採用int或者str型別來作為字典的key,但是在某些場景中,會造成一定的麻煩。
如我們有乙個處理http request的規則類名為rule,其定義如下,它由乙個request path和其支援的request methods陣列組成:
classrule(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 =
d[r2]
#兩個不同的物件,列印出none
r1和r2雖然是兩個不同的物件例項,但是在業務邏輯上是一致的,因此如果我們想讓兩個在邏輯上一致的物件被認為是同乙個key,可以通過一些手段達到這個效果。
為rule新增兩個方法__hash__和__eq__,其意義可以檢視python官方文件。
classrule(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...