2021年4月份去富途面試問(wèn)道的問(wèn)題,現(xiàn)在記錄一下
python中dict類型的key值要求是不可變類型送火,通常來(lái)說(shuō)拳话,我們一般采用int或者str類型來(lái)作為字典的key,但是可不可以用可變類型作為dict的key呢种吸?
當(dāng)時(shí)面試官給出了下面這道題假颇,代碼大致如下:
class Dog():
def __init__(self, name, color):
self._n = name
self._c = color
# 初始化三個(gè)對(duì)象
dog_1 = Dog(name='mike', color='red')
dog_2 = Dog(name='tom', color='blue')
dog_3 = Dog(name='tom', color='blue')
# 字典,并用初始化的對(duì)象作為key骨稿,設(shè)置value
house = {}
house[dog_1] = 1
house[dog_2] = 2
# 打印出三個(gè)對(duì)象的哈希值,發(fā)現(xiàn)dog_2 dog_3是相等的
print(hash(dog_1)) # 2766680834235181893
print(hash(dog_2)) # 9159254995178818247
print(hash(dog_3)) # 9159254995178818247
# 取值
for item in house:
print(house[item]) # 1 2
要求如下:
print(house[dog_3] == 2) # 當(dāng)打印house[dog_3] 結(jié)果為2
當(dāng)時(shí)這道題目沒做出來(lái)姜钳,回來(lái)后查找相關(guān)坦冠,才發(fā)現(xiàn)這道題的考點(diǎn)是python當(dāng)中的兩個(gè)魔法方法 ,代碼如下
# 為Rule添加兩個(gè)方法__hash__和__eq__,其意義可以查看python官方文檔哥桥。
class Dog():
def __init__(self, name, color):
self._n = name
self._c = color
# 關(guān)鍵代碼辙浑,富途面試
def __hash__(self):
return hash(self._n + self._c)
# 關(guān)鍵代碼,富途面試
def __eq__(self, other):
return (self._n, self._c) == (other._n, other._c)
其實(shí)這道題的考點(diǎn)是從flask框架中路由裝飾器中@app.route()中延伸出來(lái)的拟糕,有興趣的朋友可以去看看【flask路由映射map表】相關(guān)資料判呕,也可以自己嘗試去看看flask路由相關(guān)源碼
route裝飾器
在Flask應(yīng)用中,我們一般通過(guò)decorator裝飾view函數(shù)送滞,來(lái)注冊(cè)一個(gè)路由侠草,表示url和處理函數(shù)的對(duì)應(yīng)關(guān)系,例如:
@app.route('/')
def index():
return 'Hello World'
route裝飾器定義如下, 其本質(zhì)是調(diào)用了Flask對(duì)象的add_url_rule函數(shù):
def route(self, rule, **options):
def decorator(f):
endpoint = options.pop('endpoint', None)
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator
add_url_rule函數(shù)簽名為def add_url_rule(self, rule, endpoint=None, view_func=None, **options)犁嗅,其主要做了以下4件事情:
1边涕,endpoint默認(rèn)取view函數(shù)名稱
2,提供默認(rèn)的 http方法(HEAD, OPTION)
3,創(chuàng)建url_rule_class對(duì)象(url_rule_class默認(rèn)為werkzeug.routing.Route類)功蜓,并添加到url_map中(werkzeug.routing.Map對(duì)象)
4园爷,將endpoint和view_func保存到view_functions字典中