2010-08-06 33 views
5

cách truy cập trang trí từ lớp cơ sở ở trẻ?Truy cập trang trí trong lớp cha từ con trong Python

Tôi giả định (sai) rằng ffg. sẽ làm việc:

class baseclass(object): 
    def __init__(self): 
     print 'hey this is the base' 

    def _deco(func): 
     def wrapper(*arg): 
      res = func(*arg) 
      print 'I\'m a decorator. This is fabulous, but that colour, so last season sweetiedarling' 
      return res 
     return wrapper 

    @_deco 
    def basefunc(self): 
     print 'I\'m a base function' 

Lớp này hoạt động tốt, nhưng sau đó tôi tạo ra một lớp con kế thừa từ này:

class otherclass(baseclass): 
    def __init__(self): 
     super(otherclass, self).__init__() 
     print 'other class' 


    @_deco 
    def meh(self): 
     print 'I\'m a function' 

này thậm chí sẽ không nhập khẩu đúng cách, hãy để một mình chạy. @_deco không xác định. Đang thử baseclass._deco ném một lỗi _deco() của phương thức không ràng buộc, điều này không thực sự đáng ngạc nhiên.

Bất kỳ ý tưởng làm thế nào để làm điều này, tôi thực sự muốn đóng gói trang trí trong lớp, nhưng tôi không kết hôn với ý tưởng và tôi cần phải gọi nó trong cơ sở & lớp con.

+0

Trường hợp sử dụng cho điều này là trang trí thời gian thô cho bộ điều khiển giá treo. Vì vậy, nó cần phải được truy cập từ baseclass vì có các hàm trong đó sẽ phải được tính giờ, và các hàm trong lớp con cần phải được định thời gian. Tôi đoán cách đơn giản nhất là chỉ cần tách nó ra khỏi lớp học. – dochead

+0

Bạn có thể sửa định dạng của mình không? Lớp 'def __init__' của lớp của bạn có cùng độ thụt lề như định nghĩa lớp. – MattH

Trả lời

7
class baseclass(object): 
    def __init__(self): 
     print 'hey this is the base' 

    def _deco(func): 
     def wrapper(*arg): 
      res = func(*arg) 
      print 'I\'m a decorator. This is fabulous, but that colour, so last season sweetiedarling' 
      return res 
     return wrapper 

    @_deco 
    def basefunc(self): 
     print 'I\'m a base function' 

    @_deco 
    def basefunc2(self): 
     print "I'm another base function" 

    #no more uses of _deco in this class 
    _deco = staticmethod(_deco) 
    # this is the key. it must be executed after all of the uses of _deco in 
    # the base class. this way _deco is some sort weird internal function that 
    # can be called from within the class namespace while said namespace is being 
    # created and a proper static method for subclasses or external callers. 


class otherclass(baseclass): 
    def __init__(self): 
     super(otherclass, self).__init__() 
     print 'other class' 


    @baseclass._deco 
    def meh(self): 
     print 'I\'m a function' 
+0

+1; tốt hơn nhiều so với câu trả lời của tôi (giờ đã bị xóa). – bernie

+0

Tuyệt vời, tôi sẽ có một số trong đó, đó là như vậy trong mùa giải này, sweetiedarling. (Tôi nghĩ tôi chỉ muốn đi với chủ đề.) – dochead

+0

Tôi cũng thấy rằng bạn cũng có thể sử dụng trang trí @staticmethod, nhưng CHỈ nếu bạn không khai báo @_deco trong lớp cơ sở (bạn là ai). Vì vậy, giải pháp này có vẻ phù hợp hơn với câu hỏi đang được hỏi. –

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