2016-11-19 17 views
5

Trong phần trên Custom Classes của The Python Language Reference nó được tuyên bố rằng:lớp học với thuộc tính __bases__ trống Tuỳ chỉnh

thuộc tính đặc biệt: __name__ là tên lớp; __module__ là tên mô-đun trong đó lớp được xác định; __dict__ là từ điển chứa không gian tên của lớp; __bases__ là một bộ tuple (có thể trống hoặc một singleton) có chứa các lớp cơ sở, theo thứ tự xuất hiện của chúng trong danh sách lớp cơ sở; __doc__ là chuỗi tài liệu của lớp học hoặc None nếu không xác định.

Vì vậy, __bases__ cho lớp tùy chỉnh có thể "có thể trống"? Làm thế nào có thể đạt được nếu mọi thứ ngầm kế thừa từ object trong Python 3?

Lớp chỉ với một sản phẩm nào __bases__object bản thân:

>>> object.__bases__ 
() 

Tôi có thiếu cái gì?

+7

này trông giống như một thiếu sót trong các tài liệu mà đã không bị xóa khi Python '3' được khởi chạy. 'class Foo: pass' trong Python' 2.x' mang lại '()' cho 'Foo .__ bases__'. –

+0

Tất nhiên, tôi chỉ đoán; Tôi không biết nếu có bất kỳ ma thuật đen nào có thể cho phép bạn định nghĩa một lớp với một '__bases__' trống trong' Py3'. –

Trả lời

2

Dòng đã có từ trước khi Python 3 được phát hành. Đây là 2007 commit. Khi mô hình đối tượng được tân trang lại để loại bỏ các lớp kiểu cũ, có vẻ như thông tin đó trong tài liệu bị trượt qua đánh giá và có thể chỉ là thông tin sai lệch bây giờ.

Tôi có thể đề nghị bạn tăng documentation issue để làm rõ liệu nó có sai không/lỗi thời.

+0

Git Hub sẽ không hiển thị hoặc thậm chí đặt tên tất cả (400 tệp cộng) của cam kết đó. Đoạn trích dẫn nằm trong "Tài liệu/tham khảo/datamodel.rst' của [commit' e395d94'] (https://github.com/python/cpython/blob/e395d9483cba40d328a49a42c75b79e3ef1dd770/Doc/reference/datamodel.rst). –

2

đoạn Đó không phải là quá nhiều sai như nhầm lẫn, do nơi nó xuất hiện: "lớp Custom" là nơi duy nhất trong các tài liệu Data Model nơi __bases__ được đề cập ở tất cả. Kể từ khi làm việc với các lớp tùy chỉnh là thời gian duy nhất bạn có thể quan tâm đến nội dung của __bases__, tôi đoán rằng làm cho một số ý nghĩa.

Điều ngạc nhiên là nó đưa ra mô tả đầy đủ về __bases__, bao gồm các chi tiết chỉ áp dụng cho non-các lớp tùy chỉnh như nội trang dựng sẵn, object. Như bạn chỉ ra, object.__bases__ trống:

>>> object.__bases__ 
() 

Tôi nghĩ cụm từ đó được coi là một heads-up mà unknown_class.__bases__[0] có thể nâng cao một IndexError, bởi vì ngay cả trong Python 3, __bases__thể được sản phẩm nào.

__bases__ cũng có thể là một đơn lẻ. Tại sao mọi người lại quan tâm đến số tiền , tôi không thể tưởng tượng được. Có lẽ bởi "singleton", họ có nghĩa là "1-tuple"? Er, OK ... Tôi vẫn không quan tâm.

Cập nhật: Như wim has pointed out, đoạn trong câu hỏi được nhập khẩu cùng với all of Python 2's Docs/reference/datamodel.rst on Wed 15 tháng 8 năm 2007, và vẫn về cơ bản không thay đổi kể từ đó. Tuy nhiên, phần trong đó chỉ là "Lớp". Phần đó là renamed to "Custom classes" vào ngày 31 tháng 8 năm 2007, là một phần của nỗ lực xóa bỏ sự khác biệt "kiểu cũ"  /"kiểu mới".

Việc thêm từ "Tùy chỉnh" dường như không cải thiện, vì phần lớn phần đó áp dụng cho hầu hết hoặc có thể tất cả các lớp (tôi không biết mức độ áp dụng cho các lớp được biên dịch từ ngôn ngữ khác) .

PS: Trong bất cứ trường hợp của cám dỗ để lén lút thay thế __bases__ thuộc tính sau khi tạo lớp, Python 3 đã bị một thông báo lỗi đặc biệt chỉ dành riêng cho bạn ...

>>> class A: pass 
... 
>>> A.__bases__ 
(<class 'object'>,) 
>>> A.__bases__ =() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: can only assign non-empty tuple to A.__bases__, not() 
Các vấn đề liên quan