extend getattr()

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Rotlaus

    extend getattr()

    Hello,

    lets assume i have some classes:

    class A(object):
    def __init__(self):
    b = B()

    class B(object):
    def __init__(self):
    c = C()

    class C(object):
    def __init__(self):
    pass

    and now i wanna do something like this:

    a=A()
    c=getattr(a, 'b.c')

    I know this doesn't work, but what can i do to get this or a similar
    functionality to get it work for this sample and for even more nested
    classes?

    Kind regards,

    Andre
  • =?ISO-8859-1?Q?Gerhard_H=E4ring?=

    #2
    Re: extend getattr()

    Rotlaus wrote:
    Hello,
    >
    lets assume i have some classes:
    [...]
    >
    a=A()
    c=getattr(a, 'b.c')
    >
    I know this doesn't work, but what can i do to get this or a similar
    functionality to get it work for this sample and for even more nested
    classes?
    Just recursively apply the getattr(), like this:

    class A(object):
    def __init__(self):
    self.b = B()

    class B(object):
    def __init__(self):
    self.c = C()

    class C(object):
    def __init__(self):
    pass

    def ext_getattr(obj , attr):
    for subattr in attr.split(".") :
    obj = getattr(obj, subattr)
    return obj

    a=A()
    c = ext_getattr(a, 'b.c')

    -- Gerhard

    Comment

    • =?iso-8859-1?q?C=E9dric_Lucantis?=

      #3
      Re: extend getattr()

      Le Thursday 26 June 2008 13:06:53 Rotlaus, vous avez écrit :
      Hello,
      >
      lets assume i have some classes:
      >
      class A(object):
      def __init__(self):
      b = B()
      >
      class B(object):
      def __init__(self):
      c = C()
      >
      note you're just defining some local variables here, should be self.b = B()
      and self.c = C().
      class C(object):
      def __init__(self):
      pass
      >
      and now i wanna do something like this:
      >
      a=A()
      c=getattr(a, 'b.c')
      >
      I know this doesn't work, but what can i do to get this or a similar
      functionality to get it work for this sample and for even more nested
      classes?
      >
      You could do it manually:

      c = getattr(getattr (a, 'b'), 'c')

      or make it automatic:

      def get_dotted_attr (obj, dotted_attr) :
      for attr in dotted_attr.spl it('.') :
      obj = getattr(obj, attr)
      return obj

      a = A()
      print 'a.b.c = %s' % get_dotted_attr (a, 'b.c')

      --
      Cédric Lucantis

      Comment

      • George Sakkis

        #4
        Re: extend getattr()

        On Jun 26, 7:39 am, Cédric Lucantis <o...@no-log.orgwrote:
        Le Thursday 26 June 2008 13:06:53 Rotlaus, vous avez écrit :
        >
        Hello,
        >
        lets assume i have some classes:
        >
        class A(object):
        def __init__(self):
        b = B()
        >
        class B(object):
        def __init__(self):
        c = C()
        >
        note you're just defining some local variables here, should be self.b =B()
        and self.c = C().
        >
        class C(object):
        def __init__(self):
        pass
        >
        and now i wanna do something like this:
        >
        a=A()
        c=getattr(a, 'b.c')
        >
        I know this doesn't work, but what can i do to get this or a similar
        functionality to get it work for this sample and for even more nested
        classes?
        >
        You could do it manually:
        >
        c = getattr(getattr (a, 'b'), 'c')
        >
        or make it automatic:
        >
        def get_dotted_attr (obj, dotted_attr) :
        for attr in dotted_attr.spl it('.') :
        obj = getattr(obj, attr)
        return obj
        >
        a = A()
        print 'a.b.c = %s' % get_dotted_attr (a, 'b.c')
        FYI, this feature will exist in operator.attrge tter from Python 2.6,
        i.e. you'll be able to say attrgetter('b.c ')(a).

        George

        Comment

        Working...