I'm playing a bit with python dynamic methods and I came up with a
scenario that I don't understant. Considering the follow code:
# Declare a dummy class
class A(object):
pass
# generate a dynamic method and insert it to A class
for name in ['a', 'b', 'c']:
if name == 'b':
@property
def get_name(self):
return name
A.name = get_name
a_instance = A()
a_instance.name
# So far I exptect that a_instance.name returns 'b', since it has
been created when name == 'b', but this is what actually returns:
>>> a_instance.name
'c'
just the last 'name' value.
What can I do in order to generate a method like this but that returns
'b' ? What is wrong in my understanding of this pice of code?
> I'm playing a bit with python dynamic methods and I came up with a
> scenario that I don't understant. Considering the follow code:
> # Declare a dummy class
> class A(object):
> pass
> # generate a dynamic method and insert it to A class
> for name in ['a', 'b', 'c']:
> if name == 'b':
> @property
> def get_name(self):
> return name
> A.name = get_name
> a_instance = A()
> a_instance.name
> # So far I exptect that a_instance.name returns 'b', since it has
> been created when name == 'b', but this is what actually returns:
>>>> a_instance.name
> 'c'
> just the last 'name' value.
> What can I do in order to generate a method like this but that returns
> 'b' ? What is wrong in my understanding of this pice of code?
Look at the method again:
> def get_name(self):
> return name
It returns the global variable name. Why would you expect to see a historical value of that variable?
If you want to capture the value of name at the time when get_name() is defined you have several options:
> > I'm playing a bit with python dynamic methods and I came up with a
> > scenario that I don't understant. Considering the follow code:
> > # Declare a dummy class
> > class A(object):
> > pass
> > # generate a dynamic method and insert it to A class
> > for name in ['a', 'b', 'c']:
> > if name == 'b':
> > @property
> > def get_name(self):
> > return name
> > A.name = get_name
> > a_instance = A()
> > a_instance.name
> > # So far I exptect that a_instance.name returns 'b', since it has
> > been created when name == 'b', but this is what actually returns:
> >>>> a_instance.name
> > 'c'
> > just the last 'name' value.
> > What can I do in order to generate a method like this but that returns
> > 'b' ? What is wrong in my understanding of this pice of code?
> Look at the method again:
> > def get_name(self):
> > return name
> It returns the global variable name. Why would you expect to see a
> historical value of that variable?
hehe, yeah, after sending my email I realized that it was obvious, but
the true is I came up with this problem in a more complex situation
involving lot's of imports and so on.. so the question: wtf is going
on?? came up to me at this time :P