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')

クラスを拡張するにはどうすればよいですかControlButtonクラスのオブジェクトからオブジェクトのWindow関数getWindowNameとフィールドwind_nameにアクセスしますbtnOKか?

self.wnd = wndクラスControlにフィールドを作成せずに、または...にメソッドsetWindowNameを追加しない方法はありWindowますか?

Controlクラスからクラスを継承できませんWindow!これは論理的ではありません。

4

2 に答える 2

2

Pythonでは、複数のクラスからの継承が可能です。

class Button(Control, Window):
    ...

ただし、この場合は、自分が何をしているのかを正確に知る必要があります(Pythonsメソッド解決順序(MRO)と言えば)。この小さな本を読むことをお勧めします:Pythonの属性とメソッド

于 2012-08-07T10:25:31.397 に答える
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()
于 2012-08-07T10:37:04.030 に答える