Tôi đang cố chuyển đối số tùy chọn cho trình trang trí lớp của mình trong python. Dưới đây là đoạn code tôi hiện có:Đối số trang trí lớp học Python
class Cache(object):
def __init__(self, function, max_hits=10, timeout=5):
self.function = function
self.max_hits = max_hits
self.timeout = timeout
self.cache = {}
def __call__(self, *args):
# Here the code returning the correct thing.
@Cache
def double(x):
return x * 2
@Cache(max_hits=100, timeout=50)
def double(x):
return x * 2
Các trang trí thứ hai với lý lẽ để ghi đè lên một mặc định (max_hits=10, timeout=5
chức năng __init__
của tôi), không hoạt động và tôi đã nhận ngoại trừ TypeError: __init__() takes at least 2 arguments (3 given)
. Tôi đã thử nhiều giải pháp và đọc các bài viết về nó, nhưng ở đây tôi vẫn không thể làm cho nó hoạt động được.
Bất kỳ ý tưởng nào để giải quyết vấn đề này? Cảm ơn!
Xin cảm ơn các bạn và @lunixbochs về giải pháp của bạn! Hoạt động như một nét duyên dáng :) – Dachmt
Nếu nhà phát triển gọi'Cache' với vị trí thay vì đối số từ khóa (ví dụ: '@Cache (100,50)') thì 'hàm' sẽ được gán giá trị 100 và' max_hits' 50. An lỗi sẽ không được nâng lên cho đến khi hàm được gọi. Điều này có thể được coi là hành vi đáng ngạc nhiên vì hầu hết mọi người mong đợi thống nhất vị trí và ngữ nghĩa từ khóa. – unutbu