On Sat, May 18, 2019 at 4:40 AM Irv Kalb <i...@furrypants.com> wrote:
>
> Thanks for your comments.  I am very aware of all the other issues that you 
> explained.
>
> The only thing that threw me was that in a line like:
>
> self.x = self.x + 1
>
> in a method, these two uses of self.x can refer to different variables.  I 
> actually teach Python, and this would be a very difficult thing to explain to 
> students.
>
> I have never run across this issue because I would never use the same name as 
> an instance attribute and a class attribute.  (I also know that "attribute" 
> is the "official" terms, but I've called them instance variables and class 
> variables for so many years (working in other languages), that I use those 
> terms without thinking.)
>

Yes, this is a little unusual. It's a consequence of the
run-time-lookup that defines attributes, as opposed to the
compile-time-lookup that defines most name bindings. For instance:

x = 0
def f():
    print(x)
    x = 1
    print(x)

will raise UnboundLocalError, rather than printing zero followed by
one. But the global and builtin namespaces are looked up completely
dynamically:

class int(int): pass

This will look up the built-in "int" type, create a subclass, and make
that a global.

So this is uncommon, but not unique. Sometimes, if one thing doesn't
exist, you find another - even if it's going to exist a moment later.

ChrisA
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to