2009-09-07 57 views
22

Có tương tự C# cho trình trang trí chức năng của Python không? Có vẻ như nó có thể thực hiện được với các thuộc tính và khung phản chiếu, nhưng tôi không thấy một cách để thay thế các hàm trong thời gian chạy.trang trí chức năng trong C#

Python decorators thường làm việc theo cách này:

class decorator(obj): 
    def __init__(self, f): 
     self.f = f 
    def __call__(self, *args, **kwargs): 
     print "Before" 
     self.f() 
     print "After" 

@decorator 
def func1(): 
    print "Function 1" 

@decorator 
def func2(): 
    print "Function 2" 

Calling Func1 và Func2 sau đó sẽ cho kết quả trong

 
Before 
Function 1 
After 
Before 
Function 2 
After 

Ý tưởng là trang trí sẽ cho tôi dễ dàng thêm tác vụ thông thường tại các điểm xuất nhập cảnh của nhiều hàm.

+0

Tôi thấy đây là một phần giới thiệu thú vị về lý do trái ngược với điều gì. http://python.about.com/gi/dynamic/offsite.htm?zi=1/XJ&sdn=python&cdn=compute&tm=12&f=10&su=p284.9.336.ip_p504.1.336.ip_&tt=29&bt=0&bts=1&zu=http % 3A // www.python.org/doc/2.4.4/whatsnew/node6.html – ShuggyCoUk

+0

Hmm, tôi đã hy vọng một thứ gì đó đã được tích hợp sẵn trong ngôn ngữ nhưng từ các câu trả lời có vẻ như không có cách nào đơn giản để làm nó mà không cần thêm một khung công tác mới. Dự án của tôi rất nhỏ nên có lẽ nó quá mức cần thiết để làm theo cách đó. – jtjin

Trả lời

9

Bạn có thể làm điều đó bằng cách sử dụng Post Sharp. Xem video giới thiệu để biết hướng dẫn.

+1

Bài Sharp trông khá tuyệt vời, nhưng việc thêm một khung công tác vào dự án nhỏ bé của tôi có thể là một chút quá mức cần thiết cho những gì tôi cần để trang trí chức năng. Thanks anyway: D – jtjin

+0

Nó thực sự đơn giản, chỉ cần thêm một tham chiếu và kế thừa một thuộc tính. –

+0

Nó cũng có chi phí EUR329 sau thời gian dùng thử 45 ngày. – Magnus

12

Cách tôi đạt được điều này là thông qua AOP frameworks như Castle Dynamic Proxy, Spring.NET hoặc thậm chí Policy Injection Application Block.

+0

Cảm ơn các con trỏ đến AOP - Tôi nghĩ rằng việc thêm một khuôn khổ cho dự án nhỏ bé của tôi có thể là một chút quá mức cần thiết, ít nhất là cho những gì tôi muốn trang trí ở nơi đầu tiên. Dù sao cũng cảm ơn bạn :) – jtjin

4

bạn có thể sắp xếp điều đó bằng "ContextBoundObject" trong khuôn khổ .NET. nhưng nó hơi phức tạp vì nó về cơ bản sử dụng .net cơ sở hạ tầng từ xa để chặn các cuộc gọi phương thức. (chi phí thời gian chạy là tối thiểu nếu các cuộc gọi của bạn nằm trong cùng một miền ứng dụng nhưng chỉ trên "ngữ cảnh" khác nhau). do đó các phương pháp tiếp cận tốt hơn sẽ là những cách được đề cập ở trên bởi các áp phích khác.