Welches Attribut verändern?

11/10/2009 - 13:37 von Florian Lindner | Report spam
Hallo,

ich habe eine Klasse, die folgende Beziehung kapselt:

a + b + c = const.

Alle 3 Größen (a,b,c) lassen sich über properties manipulieren. Nun habe
ich das Problem, wenn der Benutzer der Klasse a=n setzen will, muss ich
b oder c anpassen (oder natürlich beide, aber das will ich nicht). Nun
überlege ich, welche Möglichkeiten ich habe, dem Benutzer entscheiden zu
lassen, ob b oder c angepasst wird.

- So weit ich weiß kann man properties keine Argumente übergeben. Ich
kann also nicht per Property sagen: Setze a, passe b (oder c) an.

- Ich könnte es nicht über properties machen, sondern über eine
Funktion: def set_a(new_a, fixed="b") so dass per default c angepasst wird.

- Ich könnte der Klasse ein neues Attribut spendieren, welches angibt,
welche Größe veràndert werden soll: obj.keep_fixed = "b"

Fallen Euch noch andere Lösungen für dieses Problem ein bzw. wie geht
ihr damit um?

Grüße,

Florian
 

Lesen sie die antworten

#1 Andreas Bruhn
11/10/2009 - 17:17 | Warnen spam
Hallo Florian!


Am Sun, 11 Oct 2009 13:37:23 +0200 schrieb Florian Lindner:

Hallo,

ich habe eine Klasse, die folgende Beziehung kapselt:

a + b + c = const.

Alle 3 Größen (a,b,c) lassen sich über properties manipulieren. Nun habe
ich das Problem, wenn der Benutzer der Klasse a=n setzen will, muss ich
b oder c anpassen (oder natürlich beide, aber das will ich nicht). Nun
überlege ich, welche Möglichkeiten ich habe, dem Benutzer entscheiden zu
lassen, ob b oder c angepasst wird.



So ganz spontan würde ich das über Properties machen. :-)

#!/usr/bin/env python
# -*- coding: utf-8 -*-


class Klasse(object):
def __init__(self, konstant):
self._a = 0
self._b = 0
self._c = 0
self._const = konstant

def set_a(self, a):
self._a = a
def get_a(self):
self._a = self._const - self._b - self._c
return self._a

a = property(get_a, set_a)

def set_b(self, b):
self._b = b

def get_b(self):
self._b = self._const - self._a - self._c
return self._b

b = property(get_b, set_b)

def set_c(self, c):
self._c = c
def get_c(self):
self._c = self._const - self._b - self._a
return self._c

c = property(get_c, set_c)


if __name__ == '__main__':
zehn = Klasse(10)
print 'a=', zehn.a # a= 10
print 'b=', zehn.b # b= 0
print 'c=', zehn.c # c= 0

zehn.b = 3
print 'a=', zehn.a # a= 7
print 'b=', zehn.b # b= 3
print 'c=', zehn.c # c= 0

zehn.b = 2
print 'c=', zehn.c # c= 1
print 'a=', zehn.a # a= 7

Ähnliche fragen