2010-05-25 33 views
13

Tôi đang tìm hiểu về metaclasses trong Python. Tôi nghĩ rằng đó là một kỹ thuật rất mạnh mẽ, và tôi đang tìm cách sử dụng tốt cho họ. Tôi muốn một số ý kiến ​​phản hồi của ví dụ hữu ích trong thế giới thực hữu ích khi sử dụng metaclasses. Tôi không tìm kiếm mã ví dụ về cách viết một metaclass (có rất nhiều ví dụ về metaclasses vô dụng), nhưng các ví dụ thực tế nơi bạn đã áp dụng kỹ thuật và nó thực sự là giải pháp thích hợp. Quy tắc là: không có khả năng lý thuyết, nhưng metaclasses tại nơi làm việc trong một ứng dụng thực tế.Sử dụng metaclasses tốt trong thế giới thực (ví dụ: bằng Python)

Tôi sẽ bắt đầu với một ví dụ tôi biết:

  • Django mô hình, cho lập trình declarative, nơi mà các lớp cơ sở mẫu sử dụng một metaclass để điền vào các đối tượng mô hình chức năng hữu ích từ ORM các định nghĩa thuộc tính.

Mong đóng góp của bạn.

Trả lời

2

FormEncode xác nhận và Turbogears/Tosca widget.

Bạn cũng có thể quan tâm classdecorators: chúng có thể được viết bằng các bản phát hành mới nhất và bao gồm nhiều trường hợp sử dụng trước đó được xử lý bằng metaclasses.

0

SQLalchemy cũng sử dụng chúng cho các mô hình cơ sở dữ liệu khai báo.

Xin lỗi câu trả lời của tôi không khác với ví dụ của bạn, nhưng nếu bạn đang tìm kiếm mã ví dụ, tôi thấy declarative là khá dễ đọc.

3

Trong Python 2.6 và 3.1, thư viện chuẩn Python cung cấp abc.ABCMeta, một siêu lớp cho Lớp cơ sở trừu tượng ("ABC"). Các lớp sử dụng meta-class có thể sử dụng @abstractmethod và @abstractproperty để định nghĩa các phương thức trừu tượng và các thuộc tính. Lớp meta sẽ đảm bảo rằng các lớp dẫn xuất ghi đè lên các phương thức trừu tượng và các thuộc tính.

Ngoài ra, các lớp thực hiện ABC mà không thực sự kế thừa từ nó có thể đăng ký như thực hiện giao diện, để issubclassisinstance sẽ hoạt động.

Ví dụ: mô-đun collections xác định Sequence ABC. Nó cũng gọi số Sequence.register(tuple) để đăng ký loại tuple được tích hợp dưới dạng Sequence, mặc dù tuple không thực sự được kế thừa từ Sequence.

0

Lần duy nhất tôi sử dụng một metaclass cho đến nay là viết một cơ chế cảnh báo không dùng nữa. Đó là một cái gì đó dọc theo dòng sau - cú pháp có thể rất approximative, nhưng mã sẽ minh họa cho quan điểm của tôi dễ dàng hơn một câu phức tạp:

class New(object): 
    pass 

class Old(object): 
    def __new__(self): 
    deprecation_warning("Old class is no more supported, use New class instead") 
    return New() 
2

Việc triển khai Python của Bộ đệm giao thức sử dụng metaclasses để tạo ra các ràng buộc Python đại diện cho định dạng dữ liệu của bạn. From the tutorial:

Dòng quan trọng trong mỗi lớp là __metaclass__ = reflection.GeneratedProtocolMessageType. Mặc dù các chi tiết về cách hoạt động của metaclasses Python nằm ngoài phạm vi của hướng dẫn này, bạn có thể nghĩ về chúng như một khuôn mẫu để tạo các lớp.Tại thời điểm tải, metaclass GeneratedProtocolMessageType sử dụng các mô tả được chỉ định để tạo tất cả các phương thức Python bạn cần làm việc với từng loại thông báo và thêm chúng vào các lớp có liên quan. Sau đó bạn có thể sử dụng các lớp được điền đầy đủ trong mã của bạn.

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