2012-07-31 30 views
17

Tôi có một lớp học với một mẫu lặp đi lặp lại ngu si đần độn về chức năng của họ và tôi muốn biến mẫu này thành một trang trí. Nhưng vấn đề là trang trí này phải truy cập một số thuộc tính của cá thể hiện tại, vì vậy tôi muốn biến nó thành một phương thức trong lớp này. Tôi đang gặp một số vấn đề với điều đó.Phương pháp có thể là một trang trí của một phương pháp khác của cùng một lớp không?

Vì vậy, điều này cũng tương tự như những gì tôi muốn:

class DullRepetitiveClass: 
    def __init__(self, nicevariable): 
     self.nicevariable = nicevariable 

    def mydecorator(self, myfunction): 
     def call(*args, **kwargs): 
      print "Hi! The value of nicevariable is %s"%(self.nicevariable,) 
      return myfunction(*args, **kwargs) 
     return call 

    @mydecorator   #Here, comment (1) below. 
    def somemethod(self, x): 
     return x + 1 

(1) Dưới đây là vấn đề. Tôi muốn sử dụng phương pháp DullRepetitiveClass.mydecorator để trang trí phương pháp somemethod. Nhưng tôi không có ý tưởng làm thế nào để sử dụng phương pháp từ dụ hiện tại như trang trí.

Có cách nào đơn giản để thực hiện việc này không?

EDIT: Ok, câu trả lời là khá rõ ràng. Như Sven đặt nó bên dưới, trang trí tự nó chỉ biến đổi phương pháp. Bản thân phương pháp phải xử lý mọi thứ liên quan đến cá thể:

def mydecorator(method): 
    def call(self, *args, **kwargs): 
     print "Hi! The value of nicevariable is %s"%(self.nicevariable,) 
     return method(self, *args, **kwargs) 
    return call 


class DullRepetitiveClass: 
    def __init__(self, nicevariable): 
     self.nicevariable = nicevariable 

    @mydecorator    
    def somemethod(self, x): 
     return x + 1 
+1

Vui lòng sửa lỗi thụt lề của bạn. Cũng lưu ý rằng mã của bạn không chứa bất kỳ phương thức lớp nào. –

+0

Bạn có hỏi cách chuyển một thể hiện * khác * ngoài 'self' sang' mydecorator' vì nó trang trí 'somemethod' không? – kojiro

+0

Rất tiếc. Sao chép từ vim và dán vào trình duyệt có thể là một nỗi đau đôi khi ... –

Trả lời

11

Bộ trang trí chỉ có một tham số - chức năng hoặc phương pháp mà nó trang trí. Nó không được thông qua một thể hiện như tham số self - tại thời điểm trang trí được gọi, thậm chí không lớp đã được tạo ra, hãy để một mình một thể hiện của lớp. Ví dụ này sẽ được chuyển làm đối số đầu tiên cho hàm được trang trí, vì vậy bạn nên bao gồm self làm tham số đầu tiên trong danh sách tham số call().

Tôi không thấy sự cần thiết phải bao gồm trình trang trí trong phạm vi lớp học. Bạn có thể làm điều này, nhưng bạn cũng có thể có nó ở phạm vi mô-đun.

+0

Chết tiệt, nó rất rõ ràng. Trình trang trí chỉ nhận phương thức và trả về một phương thức đã sửa đổi. Phương pháp này là người phải đối phó với trường hợp ... chết tiệt. Quá rõ ràng. –

+0

Nếu trang trí của bạn cần sử dụng các thành viên của lớp thì sao? Hay đó chỉ là một ý tưởng xấu/mẫu? – aaronlevin

+0

@ weirdcanada: Vì lớp chưa được tạo vào thời điểm trang trí được gọi, bạn không thể truy cập các thành viên của nó theo kiểu thông thường. Bạn có thể làm một số hacks để làm việc xung quanh điều này (những thứ như truyền 'local()' làm tham số cho trang trí), nhưng chúng khá rõ ràng, và tôi không thể nghĩ ra một lý do chính đáng để làm điều này. –

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