mso...@linuxmail.org wrote: > Hello, > > I want to make a certain subset of public attributes available through > an interface. > > The client should not need to know the names of the attributes. > > Here is some code with the important parts missing. Anyone care to > fill in the missing parts? > > > class C: > def __init__(self): > self.a = 4 > self.b = 6 > self.c = 8 > self._set_vars([self.a, self.b]) # This call might need to be > done differently > > def get_vars(self): > # add code here... > > def _set_vars(self, vars): > # add code here... > > > c = C() > print c.get_vars() > c.a = 9 > print c.get_vars() > > > This is the desired output > [4, 6] # Values of c.a and c.b > [9, 6] # Values of c.a and c.b > > The important part is that the change to c.a is reflected in the call > to get_vars(). get_vars() and _set_vars() might be moved to a base > class, > and therefore should not have attribute names hard coded in them. > > I don't have a specific problem that I'm trying to solve. I would > just like > to know how this sort of thing could be done.
I'd do it roughly like this: class Base(object): EXPORTED_VARIABLES = [] def get_vars(self): all_variables = set(sum((getattr(cls, "EXPORTED_VARIABLES", []) for cls in self.__class__.mro()), [])) for varname in all_variables: yield getattr(self, varname) class A(Base): EXPORTED_VARIABLES = ["a"] a = "A!" class B(Base): EXPORTED_VARIABLES = ["b"] b = "B!" class C(A,B): pass a = A() b = B() c = C() print list(a.get_vars()) print list(b.get_vars()) print list(c.get_vars()) -- http://mail.python.org/mailman/listinfo/python-list