Tôi đã có một vấn đề thú vị sáng nay. Tôi đã có một lớp cơ sở trông như thế này:Trang trí một phương pháp đã là một classmethod?
# base.py
class Base(object):
@classmethod
def exists(cls, **kwargs):
# do some work
pass
Và một module trang trí trông như thế này:
# caching.py
# actual caching decorator
def cached(ttl):
# complicated
def cached_model(ttl=300):
def closure(model_class):
# ...
# eventually:
exists_decorator = cached(ttl=ttl)
model_class.exists = exists_decorator(model_class.exists))
return model_class
return closure
Dưới đây là mô hình lớp con của tôi:
@cached_model(ttl=300)
class Model(Base):
pass
Thing là, khi tôi thực sự gọi Model.exists, tôi nhận được khiếu nại về số lượng sai đối số! Kiểm tra các đối số trong trang trí cho thấy không có gì lạ xảy ra - các đối số là chính xác những gì tôi mong đợi, và chúng phù hợp với chữ ký phương thức. Làm thế nào tôi có thể thêm các trang trí thêm vào một phương pháp đã được trang trí với classmethod
?
Không phải tất cả các mô hình đều được lưu trong bộ nhớ cache, nhưng phương thức tồn tại() có trên mọi mô hình như một lớp học, vì vậy việc sắp xếp lại trang trí không phải là một tùy chọn: cached_model
có thể thêm classmethod vào() tồn tại() một classmethod trên mô hình uncached?
Vì vậy, giải pháp là gì? Nó không rõ ràng. Nó sẽ tốt hơn nhiều nếu bạn để lại câu hỏi của bạn như nó đã được, và đăng một câu trả lời. – Marcin
Bạn * có thể * đăng câu hỏi và tự trả lời câu hỏi, nhưng hãy giữ riêng câu hỏi và trả lời. Xem http://meta.stackexchange.com/questions/17463/can-i-answer-my-own-questions-even-those-where-i-knew-the-answer-before-asking – delnan
Tôi nghĩ bạn đã quên '@ classmethod' trong lớp' Base'. –