someone wrote:
On Jun 18, 12:49 pm, James Mills <prolo...@shortcircuit.net.au> wrote:
On Fri, Jun 18, 2010 at 8:31 PM, someone <petshm...@googlemail.com> wrote:
I was looking for a "short way" to do it because I have a lot
"some_object.attr.attr or some_object.other_attr.attr" in code. it
looks like I cannot replace attr with just other variable and must
type some_object.other_attr.attr or your solution which is however
longer to type :)
It would actually help to see some code.


here it is, In Foo I'd like to have instead of A self.type and the
same in class B

from some_module import some_object

class Foo:
    def __init__(self):
        self.type = 'A'

    def printAttr(self):
        some_object.A.B
        some_object.A.C
        some_object.A.D
        some_object.A.E
        some_object.A.F
        some_object.A.G

class Bar:
    def __init__(self):
        self.type = 'B'

    def printAttr(self):
        some_object.B.B
        some_object.B.C
        some_object.B.D
        some_object.B.E
        some_object.B.F
        some_object.B.G

--James


Here is a way to to do it. Note that it is quite dangereous 'cause you may confuse everyone by accessing some_object attributes like a Foo attributes. Basically, when the attributes is not found in the Foo namespace, it will use the some_object.A or some_object.B namespace instead.


some_object = Bar()
some_object.A = Bar()
some_object.B = Bar()
some_object.A.bar = 'I come from A'
some_object.B.bar = 'I come from B'

class Foo(object):

   def __init__(self, _type):
      self.type = _type

   def __getattribute__(self, name):
      try:
          return object.__getattribute__(self, name)
      except AttributeError:
          return getattr(getattr(some_object, self.type), name)

   def __setattr__(self, name, value):
       try:
           # first look if self has the attribute, if so set it
           if object.__getattribute__(self, name):
               return object.__setattr__(self, name, value)
       except AttributeError:
           # look into some_object
           try:
               _type = object.__getattribute__(self, 'type')
               if hasattr(getattr(some_object, _type), name):
                   return setattr(getattr(some_object, _type), name, value)
           except AttributeError:
               pass
# attribute neither found in self nor in some_object, let's create it in self
       return object.__setattr__(self, name, value)

fa = Foo('A')
fb = Foo('B')

print fa.bar
> I come from A

print fb.bar
> I come from B

fa.bar = 'hello world'

print some_object.A.bar
> hello world



JM
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to