2013-03-19 29 views
11
import inspect 

class Foo(object): 
    pass 

if __name__ == '__main__': 
    print type(Foo.__init__) 
    print inspect.getsourcelines(Foo.__init__) 

Output:Trình bao bọc (wrapper_descriptor) là gì, và tại sao lại là Foo .__ init __() trong trường hợp này?

<type 'wrapper_descriptor'> 
Traceback (most recent call last): 
    *snip* 
    File "/usr/lib/python2.7/inspect.py", line 420, in getfile 
    'function, traceback, frame, or code object'.format(object)) 
TypeError: <slot wrapper '__init__' of 'object' objects> is not a module, class, method, function, traceback, frame, or code object 

Googling cho rất ít thông tin hữu ích về những gì, chính xác, một wrapper_descriptor là, và tại sao một lớp trống có một phương pháp __init__ đó không phải là một phương pháp, mà là một wrapper_descriptor.

Chính xác những gì đang xảy ra ở đây? Có phải tất cả các lớp không có phương thức __init__ có một trong các hàm wrapper_descriptor này không? Tại sao có một __init__ trong dict lớp ở tất cả?

Trả lời

6

Điều bạn đã gặp phải là chi tiết triển khai. Điều này khá điển hình đối với các lớp được triển khai trong C, vì object là. Nó không phải là một phương thức Python, nó là một phương thức C, và trình bao bọc là một phần của giao diện này.

Tại sao có một số __init__ trong dict của lớp?

Nó không nằm trong danh sách lớp, nó nằm trong mệnh đề object. object__init__ để khi bạn cố gắng gọi các lớp cơ sở của lớp học '__init__ phương pháp sử dụng super(), nó sẽ không thành công.

+0

Tài liệu C API giải thích một số chi tiết ngoài điều này, nếu bạn quan tâm. Nhưng thông thường bạn không quan tâm đến thực tế là "wrapper slot", "method-wrapper", và tương tự là những thứ mà bạn có thể gọi như thể chúng là các phương thức ràng buộc, các phương thức không liên kết, v.v., nhưng không có bất kỳ Python nào mã nguồn. – abarnert

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