2010-07-16 32 views
9

Đây là câu hỏi được nhắc bởi another question từ tôi.Mô hình trừu tượng Django so với các hỗn hợp Python đơn giản và Python ABC

Django cung cấp chức năng Abstract base classes (không giống với các lớp ABC bằng Python?) Để người ta có thể tạo Mô hình (mô hình Dj.Model) từ đó người ta có thể kế thừa, nhưng không có Mô hình đó có bảng thực tế trong cơ sở dữ liệu. Một trigger kích hoạt hành vi này bằng cách thiết lập thuộc tính 'abstract' trong lớp Meta của Model.

Bây giờ câu hỏi: tại sao Django giải quyết theo cách này? Tại sao cần cho loại mô hình 'Tóm tắt cơ sở' đặc biệt này? Tại sao không tạo ra một mixin Model bằng cách thừa kế từ lớp đối tượng và trộn lẫn với một Model hiện có? Hoặc điều này cũng có thể bởi một nhiệm vụ cho Python ABC? (Tâm trí bạn tôi không phải là rất quen thuộc với các lớp học ABC bằng Python, sự thiếu hiểu biết của tôi có thể hiển thị ở đây)

Trả lời

11

Tôi sẽ cố gắng để được hợp lý Tóm lại, vì điều này có thể dễ dàng biến thành một phê phán dài:

ABCs là bởi vì chúng chỉ được giới thiệu trong Python 2.6, và các nhà phát triển Django có lộ trình thiết lập cho hỗ trợ phiên bản Python (hỗ trợ 2.3 chỉ được giảm xuống 1.2).

Đối với mixin kế thừa đối tượng, chúng sẽ ít Pythonic theo nhiều cách hơn là chỉ giảm khả năng đọc. Django sử dụng một metaclass ModelBase cho các đối tượng Model, thực tế phân tích các đặc tính mô hình được xác định khi khởi tạo và điền Model._meta với các trường, Meta tùy chọn và các thuộc tính khác. Nó có ý nghĩa để tái sử dụng khuôn khổ đó cho cả hai loại mô hình. Điều này cũng cho phép Django ngăn chặn các trường mô hình trừu tượng bị tràn ngập bởi các mô hình kế thừa.

Có rất nhiều lý do tôi có thể nghĩ đến, tất cả chúng đều nhỏ nhặt trong chính chúng, nhưng chúng thêm vào để thực hiện việc triển khai hiện tại nhiều hơn Pythonic. Không có gì sai khi sử dụng mixin kế thừa đối tượng.

+0

(Đánh dấu phần này là câu trả lời được chấp nhận, mặc dù Daniel cũng tốt, nhưng Aram đã mở rộng thêm một chút về các bit gritty-nitty.) Tôi có đúng khi hiểu rằng, bằng cách sử dụng mixin kế thừa đối tượng tôi có thể để khai báo các trường thừa trên Mô hình? Nhưng tôi có thể thêm các phương thức bổ sung hoặc ghi đè chúng? – hopla

+0

Có, các hỗn hợp kế thừa đối tượng có thể khai báo các trường và phương thức bổ sung. Bạn có thể ghi đè lên các phương thức bằng cách đảm bảo rằng hỗn hợp kế thừa đối tượng của bạn xuất hiện đầu tiên trong danh sách các lớp để kế thừa từ đó. Tuy nhiên, bất kể thứ tự, một mixin kế thừa đối tượng không thể ghi đè lên một trường (nó sẽ không thất bại để xác nhận nếu nó cố gắng mặc dù). –

6

Một trong những lý do là do cách thức các trường được xác định trên mô hình.

Các trường được chỉ định theo cách khai báo, theo cách mà lớp bình thường sẽ coi là thuộc tính lớp. Tuy nhiên, chúng cần phải trở thành các thuộc tính của cá thể khi lớp thực sự được khởi tạo, để mỗi cá thể có thể có giá trị riêng cho mỗi trường. Điều này được quản lý thông qua metaclass. Điều này sẽ không làm việc với một lớp cơ sở trừu tượng bình thường.

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