任務是撰寫一個類裝飾器,它讀取一個 JSON 檔案并使其鍵/值成為類的屬性。
但條件之一是必須能夠手動傳遞值(通過創建類物件)。
我幾乎做到了。只是有一個小問題。程式從 JSON 檔案中讀取資料并將它們成功傳遞給類。但是在創建類的物件期間手動傳遞值時,值不會改變,它們仍然是從 JSON 中獲取的。
只有將值作為默認值傳遞時,問題才會消失。
room = Room(1, 1) # Doesn't work
room = Room(tables=1, chairs=1) # Does work
由于引數只能作為測驗中的數字傳遞,因此我必須管理它以僅使用數字,而不是默認值。
這是代碼。
from json import load
def json_read_data(file):
def decorate(cls):
def decorated(*args, **kwargs):
if kwargs == {}:
with open(file) as f:
params = {}
for key, value in load(f).items():
params[key] = value
return cls(**params)
else:
return cls(*args, **kwargs)
return decorated
return decorate
@json_read_data('furniture.json')
class Room:
def __init__(self, tables=None, chairs=None):
self.tables = tables
self.chairs = chairs
def is_it_enough(self):
return self.chairs * 0.5 - self.tables > 0.4
kitchen = Room() # This is passing values from JSON file
print(kitchen.__dict__) # Prints {'tables': 2, 'chairs': 5}
room = Room(tables=1, chairs=1) # This is passing values manually
print(room.__dict__) # Prints {'tables': 1, 'chairs': 1}
'''
JSON file:
{
"tables": 2,
"chairs": 5
}
'''
但是如果我們更改為 room = Room(1, 1), print( room.dict ) 會再次列印 {'tables': 2, 'chairs': 5}。請幫我解決這個問題!
uj5u.com熱心網友回復:
您需要將引數添加到裝飾器。請記住,首先呼叫裝飾器,然后呼叫裝飾函式。
您可以將您的裝飾器宣告為:def json_read_data(file, *args):然后必須調整后續呼叫cls()以接受它們。第二個已經做了,第一個需要修改。
uj5u.com熱心網友回復:
看來,這個編輯確實有效: def decorated(*args, **kwargs): if not args and not kwargs:
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/507300.html
標籤:Python python-3.x 班级 装饰师
