2012-08-07 21 views
1

課堂上,我有一些類:擴大從對象

class Window(object): 
    def __init__(self, name): 
     self.wind_name = name 
    def getWindowName(self): 
     return 'wnd' + self.wind_name 

class Control(object): 
    def __init__(self, name, wnd): 
     self.contrl_name = name 
     setattr(self, 'getWindowName', wnd.getWindowName) 
     setattr(self, 'wind_name', wnd.wind_name) 
    def getControlName(self): 
     return (self.getWindowName(), 'unk' + self.contrl_name) 

class Button(Control): 
    def __init__(self, name, wnd): 
     super(Button, self).__init__(name, wnd) 
    def getControlName(self): 
     return (self.getWindowName(), 'btn' + self.contrl_name) 

wnd = Window('MyApp') 
btnOK = Button('OK', wnd) 
btnOK.getControlName() # work ok., return ('wndMyApp', 'btnOK') 
btnOK.wind_name = 'NewApp' 
btnOK.getControlName() # does not work properly., return ('wndMyApp', 'btnOK') 

我如何延長類Control | Button從類Window的對象訪問函數getWindowName和字段wind_name對象btnOK

有沒有在類Control中創建字段self.wnd = wnd的方法,或者在Window中添加方法setWindowName ...?我不能從類Window繼承類Control!這不合邏輯。

回答

0

您可以使用屬性屬性

class Window(object): 
def __init__(self, name): 
    self.wind_name = name 

def getWindowName(self): 
    return 'wnd' + self.wind_name 

class Control(object): 
    def __init__(self, name, wnd): 
     self.contrl_name = name 
     self.wnd = wnd 
     setattr(self, 'getWindowName', wnd.getWindowName) 

    def get_wind_name(self): 
     return self.wnd.wind_name 
    def set_wind_name(self, v): 
     self.wnd.wind_name = v 

    wind_name = property(get_wind_name, set_wind_name) 
    def getControlName(self): 
     return (self.getWindowName(), 'unk' + self.contrl_name) 

class Button(Control): 
    def __init__(self, name, wnd): 
     super(Button, self).__init__(name, wnd) 
    def getControlName(self): 
     return (self.getWindowName(), 'btn' + self.contrl_name) 

wnd = Window('MyApp') 
btnOK = Button('OK', wnd) 
print btnOK.getControlName() # work ok., return ('wndMyApp', 'btnOK') 
btnOK.wind_name = 'NewApp' 
print btnOK.getControlName() 
+0

謝謝,它會起作用,但我不想創建臨時屬性來存儲Window類的實例。我只想擴展'Window.self'的'Control.self'。 – Nikitron 2012-08-07 11:31:08

+0

這種方法很好,但是如果Window類會有很多變量,這很難維護。 – Nikitron 2012-08-07 11:36:22

+0

您可以使用__getattr__和__setattr__方法來代理所有方法。但是你可以很容易地將自己拍攝在腳下,所以最好是手動添加方法 – 2012-08-07 12:11:36

2

Python允許從多個類繼承,即

class Button(Control, Window): 
    ... 

但在這種情況下,你應該知道你在做什麼(蟒蛇方法解析順序(MRO)的講話)。我建議你閱讀這本小書:Python Attributes and Methods

+0

謝謝,但我很感興趣,不繼承的解決方案,或者創建臨時屬性存儲'Window'類的實例。 – Nikitron 2012-08-07 11:29:15