2008-08-29 31 views
8

Có điều gì đó giống như giao thức mô tả Python được triển khai bằng các ngôn ngữ khác không? Nó có vẻ giống như một cách tốt đẹp để tăng tính mô-đun/đóng gói mà không làm đầy triển khai lớp chứa của bạn, nhưng tôi chưa bao giờ nghe nói về một điều tương tự trong bất kỳ ngôn ngữ nào khác. Nó có khả năng vắng mặt từ các ngôn ngữ khác vì phí tra cứu không?Giao thức mô tả Python tương tự trong các ngôn ngữ khác?

Trả lời

4

Tôi cũng chưa nghe nói về tương đương trực tiếp. Bạn có thể có thể đạt được hiệu ứng tương tự với các macro, đặc biệt là trong một ngôn ngữ như Lisp có macro cực kỳ mạnh mẽ.

Tôi sẽ không ngạc nhiên nếu các ngôn ngữ khác bắt đầu kết hợp thứ gì đó tương tự vì nó rất mạnh mẽ.

0

Cả Ruby và C# đều dễ dàng cho phép bạn tạo các trình truy cập bằng cách chỉ định các phương thức getter/setter cho một thuộc tính, giống như trong Python. Tuy nhiên, điều này không được thiết kế để tự nhiên viết mã cho các phương thức này trong một lớp khác theo cách Python cho phép. Trong thực tế, tôi không chắc bao nhiêu điều này quan trọng, vì mỗi lần tôi thấy một thuộc tính được định nghĩa thông qua giao thức mô tả nó được thực hiện trong cùng một lớp.

EDIT: Darn chứng khó đọc của tôi (theo đó tôi có nghĩa là đọc sách bất cẩn). Đối với một số lý do tôi đã luôn luôn đọc "descriptor" là "decorator" và ngược lại, ngay cả khi tôi là người gõ cả hai. Tôi sẽ để lại bài viết của tôi nguyên vẹn vì nó có thông tin hợp lệ, mặc dù thông tin hoàn toàn không liên quan gì đến câu hỏi này.

Thuật ngữ "trang trí" chính là tên của mẫu thiết kế được mô tả trong sách "Mẫu thiết kế" nổi tiếng. Bài viết trên Wikipedia chứa nhiều ví dụ về các ngôn ngữ lập trình khác nhau của việc sử dụng trang trí: http://en.wikipedia.org/wiki/Decorator_pattern

Tuy nhiên, các trang trí trong bài viết đó hướng đối tượng; Các lớp trang trí của Python hoạt động theo cách chức năng bằng cách thay thế một hàm trong thời gian chạy với một hàm khác, cho phép bạn sửa đổi/thay thế hiệu quả hàm đó, chèn mã, v.v.

Điều này được biết đến trong thế giới Java là lập trình hướng AspectJ, và trình biên dịch Java AspectJ cho phép bạn thực hiện các loại điều này và biên dịch mã AspectJ của bạn (một phần của Java) thành mã Java bytecode.

Tôi không đủ quen thuộc với C# hoặc Ruby để biết phiên bản trang trí của họ sẽ là gì.

+0

[Giao thức mô tả] (http://docs.python.org/ref/descriptors.html) không giống với [mẫu trang trí] (http://www.python.org/dev/peps/ pep-0318 /) bằng Python - Tôi đang đề cập đến khả năng tạo một cá thể đối tượng thành thuộc tính của đối tượng khác được "ủy nhiệm" động. – cdleary

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