1

master一連のパラメーターを含むオブジェクトのインスタンスが 1 つあり、次にslaveマスターの属性にアクセスして変更できるオブジェクトの複数のインスタンスがあるとします。私の特定のケースでは、スレーブはwxPythonGUI オブジェクトであり、同じパラメーターを変更できる複数の GUI コントロールが存在する可能性があります。

master.parameterスレーブがいつ更新したいかを明示的に参照する場合、明らかにこれは簡単です。ただし、各スレーブオブジェクトからのイベントを処理するためにさまざまな関数を作成する必要があるため、これを行う必要はありません。

私は現在、プロパティごとにmaster個別のメソッドget_valueとメソッドを使用して、次のようなことを行っています。set_value

class Master(object):
    def __init__(self):
        self.value = 0

    def get_value(self):
        return self.value

    def set_value(self,value):
        self.value = value

class Slave(object):
    def __init__(self,getfunc,setfunc):
        self.getfunc = getfunc
        self.setfunc = setfunc

    def update(self,value):
        self.setfunc(value)

def run():
    master = Master()
    slave = Slave(master.get_value,master.set_value)

    print "\nMaster: %i\nSlave: %i" %(master.value,slave.getfunc())

    slave.update(1)
    print "\nMaster: %i\nSlave: %i" %(master.value,slave.getfunc())

if __name__ == "__main__":
    run()

私が本当にできるようにしたいのは、のようなものをslave.bound_value設定することmaster.valueです. Python がポインターをサポートしていないことは十分承知していますが、同じことを実現する Python の優れた方法があるかどうか疑問に思っていました。slavebound_valuemaster

4

2 に答える 2

2

マスターとメソッドへの呼び出しをラップbound_valueするプロパティ属性を作成することで、求めていることを達成できます。これにより、クラスのメンバー変数にすぎないように見えます。get_valueset_valuebound_valueSlave

class Slave(object):
    def __init__(self,getfunc,setfunc):
        self.getfunc = getfunc
        self.setfunc = setfunc
    @property
    def bound_value(self):
        return self.getfunc()

    @bound_value.setter
    def bound_value(self, value):
        self.setfunc(value)

次に、slave.bound_value値を取得または設定するときはいつでも、メンバー変数のように参照するだけです。

于 2013-02-14T16:20:29.957 に答える
1

私を正しい道に導いてくれたbogatronに感謝します-これが私が最終的に選んだものです:

class Master(object):
    value = 0

class Slave(object):
    def __init__(self,master,attrname):
        self._master = master
        self._attrname = attrname
    @property
    def value(self):
        return self._master.__getattribute__(self._attrname)
    @value.setter
    def value(self,newvalue):
        self._master.__setattr__(self._attrname,newvalue)

def run():
    master = Master()
    slave = Slave(master,'value')

    print master.value,slave.value
    slave.value = 2
    print master.value,slave.value

if __name__ == "__main__":
    run()
于 2013-02-14T18:03:07.603 に答える