Đối với hàm do người dùng định nghĩa, bằng Python 2 cởi và ràng buộc phương pháp được tạo ra theo yêu cầu, qua descriptor protocol; OrderedDict.__repr__
là một đối tượng phương thức như vậy, vì hàm bọc được thực hiện dưới dạng pure-Python function.
Giao thức mô tả sẽ gọi __get__
method trên các đối tượng hỗ trợ nó, vì vậy __repr__.__get__()
được gọi bất cứ khi nào bạn cố truy cập OrderedDict.__repr__
; đối với các lớp None
(không có trường hợp nào) và chính đối tượng lớp được truyền vào. Bởi vì bạn nhận được một đối tượng phương thức mới mỗi lần hàm __get__
được gọi, is
không thành công. Nó không phải là đối tượng phương thức tương tự.
dict.__repr__
không phải là hàm Python tùy chỉnh mà là hàm C và phương thức mô tả __get__
mô tả essentially just returns self
when accessed on the class. Truy cập vào các thuộc tính mang đến cho bạn cùng một đối tượng mỗi lần, vì vậy is
công trình:
>>> dict.__repr__.__get__(None, dict) is dict.__repr__ # None means no instance
True
phương pháp có một thuộc tính __func__
tham khảo chức năng bao bọc, sử dụng để kiểm tra danh tính:
>>> OrderedDict.__repr__
<unbound method OrderedDict.__repr__>
>>> OrderedDict.__repr__.__func__
<function __repr__ at 0x102c2f1b8>
>>> OrderedDict.__repr__.__func__.__get__(None, OrderedDict)
<unbound method OrderedDict.__repr__>
>>> OrderedDict.__repr__.__func__ is OrderedDict.__repr__.__func__
True
Python 3 không đi với các phương thức không bị ràng buộc, function.__get__(None, classobj)
trả về chính đối tượng hàm (vì vậy nó hoạt động như dict.__repr__
). Nhưng bạn sẽ thấy hành vi tương tự với phương pháp bị ràng buộc, phương thức được truy xuất từ một phiên bản.
Nguồn
2014-06-23 14:05:16
Python 3.3 trả về True – HashSplat
Đây là Python 2.7. – Chameleon
@JustinEngel: Đó là vì Python 3 không sử dụng các phương thức không liên kết, tất cả các phương thức đều bị ràng buộc. Hãy thử 'OrderedDict() .__ repr__ là OrderedDict() .__ repr__' trong Python 3 và bạn sẽ thấy cùng một hành vi. –