2012-08-01 35 views
8

Đây là một câu hỏi học thuật, nhiều hơn một câu hỏi thực tế. Tôi đang cố gắng nghiên cứu cơ sở của Python và tôi tự hỏi: liệu tôi có thể triển khai các trang trí staticmethodclassmethod trong Python thuần túy nếu tôi muốn không?Các trang trí tĩnh và classmethod có thể được triển khai trong Python thuần túy không?

Đối với staticmethod có thể tôi có thể giữ tham chiếu đến hàm ban đầu và gọi nó là bỏ qua đối số đầu tiên?

Đối với classmethod có thể tôi có thể giữ tham chiếu đến hàm ban đầu và gọi nó là loại đối số đầu tiên, chứ không phải là đối số? (Làm cách nào để xử lý nó được gọi trực tiếp trên lớp học?)

Một lần nữa, không phải là tôi muốn thực sự triển khai nó trong các chương trình của mình; Tôi muốn học cách ngôn ngữ hoạt động từ nó. Nếu có thể tôi sẽ thực sự đánh giá cao các mẫu mã. Nếu không, tôi sẽ đánh giá cao giải thích tại sao nó không thể được thực hiện về mặt lý thuyết. Cảm ơn!

Chỉnh sửa: Cảm ơn câu trả lời và tham chiếu đến giao thức mô tả! Như một phương tiện để mở rộng hơn nữa sự hiểu biết của tôi về Python Tôi muốn hỏi hai điều nữa:

  • này có thể được thực hiện mà không có giao thức mô tả, ví dụ bằng cách thực hiện các cuộc gọi __ __ phương pháp đặc biệt trong các lớp học của chúng tôi?

  • Giao thức mô tả có hoạt động giống như trong Python 2.7 và bằng Python 3.x không?

Xin cảm ơn!

Trả lời

10

Có những ví dụ trong the docs:

class StaticMethod(object): 
    "Emulate PyStaticMethod_Type() in Objects/funcobject.c" 

    def __init__(self, f): 
     self.f = f 

    def __get__(self, obj, objtype=None): 
     return self.f 

Và:

class ClassMethod(object): 
    "Emulate PyClassMethod_Type() in Objects/funcobject.c" 

    def __init__(self, f): 
     self.f = f 

    def __get__(self, obj, klass=None): 
     if klass is None: 
      klass = type(obj) 
     def newfunc(*args): 
      return self.f(klass, *args) 
     return newfunc 
+0

Tôi sẽ chấp nhận câu trả lời này, vì đó là câu trả lời tốt và đầy đủ cho câu hỏi ban đầu của tôi. Tuy nhiên, tôi sẽ đánh giá cao nó rất nhiều nếu bạn trả lời chỉnh sửa của tôi là tốt! Cảm ơn! – Tom

1

Bạn nên chấp nhận câu trả lời JF Sebastian, vì nó trả lời câu hỏi của bạn trực tiếp, nhưng hỏi câu hỏi này có nghĩa là bạn muốn biết về giao thức mô tả mà bạn có thể đọc về here, là thứ được sử dụng để triển khai thực hiện những nội dung Python quan trọng này (và có thể hữu ích trong mã của riêng bạn khi được sử dụng một cách tiết kiệm). property và các phương thức liên kết thông thường của ol là những thứ khác được viết bằng cách sử dụng giao thức mô tả.

Bạn nên kiểm tra xem nó ra, nó không phải là đơn giản khi bạn lần đầu tiên đọc về nó, nhưng nó sẽ nhấp vào.

+0

Cảm ơn bạn đã liên kết và giải thích! Vui lòng xem chỉnh sửa của tôi. – Tom

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