2010-06-08 38 views
15

Giúp một anh chàng ra ngoài. Có vẻ như không thể có được một trang trí để làm việc với thừa kế. Đập nó xuống ví dụ đơn giản nhất trong không gian làm việc của tôi. Vẫn không thể làm cho nó hoạt động được.Trang trí và thừa kế của Python

class bar(object): 
    def __init__(self): 
     self.val = 4 
    def setVal(self,x): 
     self.val = x 
    def decor(self, func): 
     def increment(self, x): 
      return func(self, x) + self.val 
     return increment 

class foo(bar): 
    def __init__(self): 
     bar.__init__(self) 
    @decor 
    def add(self, x): 
     return x 

Rất tiếc, tên "trang trí" không được xác định.

Được rồi, khoảng @bar.decor? TypeError: phương thức "trang trí" không được ràng buộc phải được gọi với một đối tượng thanh làm đối số đầu tiên (có thể thay thế hàm)

Ok, làm thế nào về @self.decor? Tên "tự" không được xác định.

Ok, cách khoảng @foo.decor?! Tên "foo" không được xác định.

AaaaAAaAaaaarrrrgggg ... Tôi đang làm gì sai?

+0

Trong ví dụ của bạn, bạn có thể có 'trở x + self.val' cho định nghĩa của' add' trong 'foo'. Bạn không thể làm điều này trong mã thực tế của bạn? –

+0

Đây là mã ví dụ chưng cất làm nổi bật vấn đề tôi đang gặp phải. Nếu mã đơn giản, thì có. Tuy nhiên, nó không phải. – wheaties

Trả lời

19

Xác định decor như một phương pháp tĩnh và sử dụng mẫu @bar.decor:

class bar(object): 
    def __init__(self): 
     self.val = 4 
    def setVal(self,x): 
     self.val = x 
    @staticmethod 
    def decor(func): 
     def increment(self, x): 
      return func(self, x) + self.val 
     return increment 

class foo(bar): 
    def __init__(self): 
     bar.__init__(self) 
    @bar.decor 
    def add(self, x): 
     return x 
+0

Điều này hoạt động tốt hơn vì 'self' không được sử dụng trong cả hai định nghĩa chức năng. – exupero

+1

@EShull: Thực ra, 'decor' có thể là một phương thức tĩnh, mặc dù tham chiếu' self'. 'self' chỉ được tham chiếu bên trong' increment() ', và khi gọi' f.add (10) 'trên một cá thể' foo', tham số 'self' bên trong' increment() 'sẽ tham chiếu' f', và gia tăng sẽ hoạt động như mong đợi. –

+0

Điều này có vẻ như nó sẽ hoạt động. Phải rời khỏi công việc nhưng nếu có, tôi sẽ gắn cờ đây là câu trả lời. Cảm ơn! – wheaties