2013-09-01 50 views
6

Python (2 chỉ?) Nhìn vào giá trị của biến __metaclass__ để xác định cách tạo đối tượng type từ định nghĩa lớp. It is possible to define __metaclass__ at the module or package level, trong trường hợp này, nó áp dụng cho tất cả các định nghĩa lớp tiếp theo trong mô-đun đó.Mục đích của `__metaclass__ = type` là gì?

Tuy nhiên, tôi gặp phải sau trong flufl.enum gói của __init__.py:

__metaclass__ = type 

Kể từ khi metaclass mặc định nếu __metaclass__ không được định nghĩa là type, sẽ không này không có hiệu lực? (Bài tập này sẽ hoàn nguyên về mặc định nếu __metaclass__ được chỉ định ở phạm vi cao hơn, nhưng tôi không thấy bài tập đó.) Mục đích của nó là gì?

Trả lời

9

Trong Python 2, khai báo __metaclass__ = type làm cho các khai báo mà nếu không tạo các lớp kiểu cũ sẽ tạo các lớp kiểu mới thay thế. Chỉ các lớp kiểu cũ sử dụng khai báo mức __metaclass__ mô-đun. Các lớp kiểu mới kế thừa metaclass của chúng từ lớp cơ sở của chúng (ví dụ: object), trừ khi __metaclass__ được cung cấp dưới dạng biến lớp.

Tuyên bố không thực sự được sử dụng trong mã bạn đã liên kết ở trên (không có khai báo lớp nào trong tệp __init__.py), nhưng có thể. Tôi nghi ngờ nó đã được bao gồm như là một phần của một số boilerplate mà làm cho Python 2 mã làm việc giống như Python 3 (nơi mà tất cả các lớp học luôn luôn là kiểu mới).

0

Có, nó không có hiệu lực. Nó có lẽ chỉ là một sự hiểu lầm từ tác giả của flufl.enum, hoặc còn sót lại từ mã trước đó.

Tuyên bố "siêu gói" __metaclass__ sẽ không có hiệu lực vì không có thứ gì như Python đóng gói.

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