2010-04-07 39 views
16

Trong Python, tôi muốn có thể tạo ra một hàm hoạt động như một hàm lớp và một phương thức thể hiện, nhưng với khả năng thay đổi hành vi. Trường hợp sử dụng cho điều này là dành cho một tập các đối tượng và loại có thể tuần tự hóa. Ví dụ:Tạo một phương thức đồng thời là một thể hiện và phương thức lớp

>>> class Thing(object): 
    #... 
>>> Thing.to_json() 
'A' 
>>> Thing().to_json() 
'B' 

Tôi biết rằng định nghĩa classmethod() trong funcobject.c trong nguồn Python, điều này có vẻ đơn giản với mô-đun C. Có cách nào để làm điều này từ bên trong python?

Cảm ơn!

Với sự gợi ý của mô tả, tôi đã có thể làm điều đó với đoạn mã sau:

class combomethod(object): 
    def __init__(self, method): 
     self.method = method 

    def __get__(self, obj=None, objtype=None): 
     @functools.wraps(self.method) 
     def _wrapper(*args, **kwargs): 
      if obj is not None: 
       return self.method(obj, *args, **kwargs) 
      else: 
       return self.method(objtype, *args, **kwargs) 
     return _wrapper 

Cảm ơn bạn Alex!

+1

Tại sao bạn cần phải tuần tự hóa * loại *? –

+0

có rất nhiều lý do. Trong vấn đề cụ thể của tôi, việc tuần tự hóa kiểu cho phép chúng ta tạo ra các đặc tả trong một hệ thống RPC. –

Trả lời

8

Chắc chắn, bạn chỉ cần xác định mô tả mô tả của riêng bạn. Có một hướng dẫn tuyệt vời về các bộ mô tả Python here.

Các vấn đề liên quan