By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
464,806 Members | 1,347 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 464,806 IT Pros & Developers. It's quick & easy.

extend getattr()

P: n/a
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
Jun 27 '08 #1
Share this Question
Share on Google+
3 Replies

P: n/a
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

Jun 27 '08 #2

P: n/a
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.split('.') :
obj = getattr(obj, attr)
return obj

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

--
Cédric Lucantis
Jun 27 '08 #3

P: n/a
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.split('.') :
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.attrgetter from Python 2.6,
i.e. you'll be able to say attrgetter('b.c')(a).

George
Jun 27 '08 #4

This discussion thread is closed

Replies have been disabled for this discussion.