While executing the class definition which object is referenced bythe first argument of the class me

Discussion in 'Python' started by Krishna, Mar 7, 2008.

  1. Krishna

    Krishna Guest

    >>> class Test(object):
    .... def __init__(self):
    .... self.a= 2
    .... def func(self, k = self.a):
    .... print k
    ....
    Traceback (most recent call last):
    File "<stdin>", line 1, in ?
    File "<stdin>", line 4, in Test
    NameError: name 'self' is not defined
    >>>


    In the 'definition of the class', what would the first argument 'self'
    in the methods evaluate to; when we have an object defined, it is
    bound to the object reference, but what happens while the class
    definition is executed, which I believe happens when the module
    containing the class definition is imported

    Thanks,
    Kr
     
    Krishna, Mar 7, 2008
    #1
    1. Advertising

  2. Re: While executing the class definition which object is referencedby the first argument of the class method,Y r Object attributes not allowed as default arguments

    En Thu, 06 Mar 2008 22:48:42 -0200, Krishna <>
    escribi�:

    >>>> class Test(object):

    > ... def __init__(self):
    > ... self.a= 2
    > ... def func(self, k = self.a):
    > ... print k
    > ...
    > Traceback (most recent call last):
    > File "<stdin>", line 1, in ?
    > File "<stdin>", line 4, in Test
    > NameError: name 'self' is not defined
    >>>>

    >
    > In the 'definition of the class', what would the first argument 'self'
    > in the methods evaluate to; when we have an object defined, it is
    > bound to the object reference, but what happens while the class
    > definition is executed, which I believe happens when the module
    > containing the class definition is imported


    Function default arguments are evaluated when the function is defined
    (when the class is defined, in this case) so "self" itself has not a
    value. Try this instead:

    def func(self, k=None):
    if k is None:
    k = self.a
    print k

    If None is an allowed argument, use a special marker instead:

    _marker=object()
    ....

    def func(self, k=_marker):
    if k is _marker:
    k = self.a
    ...

    --
    Gabriel Genellina
     
    Gabriel Genellina, Mar 7, 2008
    #2
    1. Advertising

  3. Krishna

    Krishna Guest

    Re: While executing the class definition which object is referencedby the first argument of the class method, Y r Object attributes not allowedas default arguments

    On Mar 6, 5:04 pm, "Gabriel Genellina" <> wrote:
    > En Thu, 06 Mar 2008 22:48:42 -0200, Krishna <>
    > escribi�:
    >
    >
    >
    > >>>> class Test(object):

    > > ... def __init__(self):
    > > ... self.a= 2
    > > ... def func(self, k = self.a):
    > > ... print k
    > > ...
    > > Traceback (most recent call last):
    > > File "<stdin>", line 1, in ?
    > > File "<stdin>", line 4, in Test
    > > NameError: name 'self' is not defined

    >
    > > In the 'definition of the class', what would the first argument 'self'
    > > in the methods evaluate to; when we have an object defined, it is
    > > bound to the object reference, but what happens while the class
    > > definition is executed, which I believe happens when the module
    > > containing the class definition is imported

    >
    > Function default arguments are evaluated when the function is defined
    > (when the class is defined, in this case) so "self" itself has not a
    > value. Try this instead:
    >
    > def func(self, k=None):
    > if k is None:
    > k = self.a
    > print k
    >
    > If None is an allowed argument, use a special marker instead:
    >
    > _marker=object()
    > ...
    >
    > def func(self, k=_marker):
    > if k is _marker:
    > k = self.a
    > ...
    >
    > --
    > Gabriel Genellina


    Thanks for the reply. I am currently using the approach suggested by
    you. But, I am more interested in knowing about the first argument
    ('self'), what does it hold to allow the evaluation of the method,
    take the example you gave, 'self.a' as Rvalue inside the method, how
    and why is this allowed, when the same 'self.a' is not allowed as the
    default argument, considering the fact that I have already specified
    'self' as first argument, only after whose evaluation, I believe would
    the next statement (k = self.a, in def func(self, k = self.a) ) gets
    evaluated

    Thanks,
    Krishna
     
    Krishna, Mar 7, 2008
    #3
  4. Krishna

    Guest

    Re: While executing the class definition which object is referencedby the first argument of the class method, Y r Object attributes not allowedas default arguments

    On Mar 7, 11:49 am, Krishna <> wrote:
    > On Mar 6, 5:04 pm, "Gabriel Genellina" <> wrote:
    >
    >
    >
    >
    >
    > > En Thu, 06 Mar 2008 22:48:42 -0200, Krishna <>
    > > escribi�:

    >
    > > >>>> class Test(object):
    > > > ...     def __init__(self):
    > > > ...             self.a= 2
    > > > ...     def func(self, k = self.a):
    > > > ...             print k
    > > > ...
    > > > Traceback (most recent call last):
    > > >   File "<stdin>", line 1, in ?
    > > >   File "<stdin>", line 4, in Test
    > > > NameError: name 'self' is not defined

    >
    > > > In the 'definition of the class', what would the first argument 'self'
    > > > in the methods evaluate to; when we have an object defined, it is
    > > > bound to the object reference, but what happens while the class
    > > > definition is executed, which I believe happens when the module
    > > > containing the class definition is imported

    >
    > > Function default arguments are evaluated when the function is defined
    > > (when the class is defined, in this case) so "self" itself has not a
    > > value. Try this instead:

    >
    > >      def func(self, k=None):
    > >          if k is None:
    > >              k = self.a
    > >          print k

    >
    > > If None is an allowed argument, use a special marker instead:

    >
    > > _marker=object()
    > > ...

    >
    > >      def func(self, k=_marker):
    > >          if k is _marker:
    > >              k = self.a
    > >          ...

    >
    > > --
    > > Gabriel Genellina

    >
    > Thanks for the reply. I am currently using the approach suggested by
    > you. But, I am more interested in knowing about the first argument
    > ('self'), what does it hold to allow the evaluation of the method,
    > take the example you gave, 'self.a' as Rvalue inside the method, how
    > and why is this allowed, when the same 'self.a' is not allowed as the
    > default argument, considering the fact that I have already specified
    > 'self' as first argument, only after whose evaluation, I believe would
    > the next statement (k = self.a, in def func(self, k = self.a) ) gets
    > evaluated
    >
    > Thanks,
    > Krishna- Hide quoted text -
    >
    > - Show quoted text -


    Is there enough information at that point in the statement to assign
    to k as specified by this language?

    No.

    Does there exist a possible language in which there is?

    Yes.
     
    , Mar 7, 2008
    #4
  5. Re: While executing the class definition which object is referencedby the first argument of the class method, Y r Object attributes notallowedas default arguments

    On Fri, 07 Mar 2008 09:49:58 -0800, Krishna wrote:

    > I am more interested in knowing about the first argument ('self'), what
    > does it hold to allow the evaluation of the method, take the example you
    > gave, 'self.a' as Rvalue inside the method, how and why is this allowed,


    "self" is treated as an argument like any other argument, except that
    when you call a method on an instance Python automatically provides the
    self for you.

    Consider the following piece of code:

    >>> class Parrot(object):

    .... def squawk(self, n):
    .... return "spam " * n
    ....
    >>> instance = Parrot()
    >>> instance.squawk(3)

    'spam spam spam '
    >>> Parrot.squawk(instance, 3)

    'spam spam spam '


    In the first call, I call the squawk() method from the instance, and
    Python automatically fills in the self argument.

    In the second call, I call the squawk() method from the class. Since the
    class doesn't know what instance I'm using, I have to manually provide
    the self argument.

    But inside the method, self is just a name in a namespace, like any other
    name. It's not special. You can do anything you like to it. You can even
    re-assign to it, or delete it:

    >>> class Spam(object):

    .... def spam(self):
    .... print "I am", self
    .... self = "foo"
    .... print "Now I am", self
    ....
    >>> x = Spam()
    >>> x.spam()

    I am <__main__.Spam object at 0xb7f5192c>
    Now I am foo
    >>> x

    <__main__.Spam object at 0xb7f5192c>



    > when the same 'self.a' is not allowed as the default argument,


    It isn't that self.a is "not allowed". Python doesn't contain any code
    that says "if the default value contains "self", raise an error. You can
    prove that for yourself:

    >>> def foo(x=self):

    .... return x
    ....
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    NameError: name 'self' is not defined
    >>>
    >>> self = 2
    >>> def foo(x=self):

    .... return x
    ....
    >>> foo()

    2



    > considering the fact that I have already specified 'self' as first
    > argument, only after whose evaluation, I believe would the next
    > statement (k = self.a, in def func(self, k = self.a) ) gets evaluated


    You believe wrong. You've already been told that the function default
    "k=self.a" is evaluated when the method is compiled, not at runtime.
    Since "self" doesn't exist at compile time, it is an error.

    There is no way to create a reference to a class instance before the
    class is even defined.




    --
    Steven
     
    Steven D'Aprano, Mar 7, 2008
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jianli Shen
    Replies:
    1
    Views:
    642
    Victor Bazarov
    Mar 13, 2005
  2. Minkyu Kim
    Replies:
    1
    Views:
    288
    Terry Reedy
    Feb 19, 2004
  3. Ark
    Replies:
    1
    Views:
    451
    Chris Torek
    Aug 7, 2004
  4. invni
    Replies:
    36
    Views:
    916
    Robert Maas, see http://tinyurl.com/uh3t
    Jul 27, 2005
  5. Will hunting
    Replies:
    2
    Views:
    460
    Will hunting
    Jan 4, 2007
Loading...

Share This Page