Re: Export variables

2009-04-21 Thread Diez B. Roggisch
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


Export variables

2009-04-21 Thread msolem
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.

Thanks,
Mike
--
http://mail.python.org/mailman/listinfo/python-list