On 26/02/19 5:25 AM, ast wrote:
I noticed a quirk difference between classes and functions
>>> x=0
>>> class Test:
x = x+1
print(x)
x = x+1
print(x)
...
Previous code doesn't generate any errors.
x at the right of = in first "x = x+1" line is
the global one (x=0), then x becomes local
within a function, this is not allowed
>>> x = 0
>>> def f():
x = x+1
>>> f()
UnboundLocalError: local variable 'x' referenced before assignment
Since x is written inside the function, it is considered as a local
variable and x in x+1 is undefined so this throw an exception
Any comment ?
At first I misunderstood the question, and even now I'm slightly mystified:-
Is the observation to do with the principles of "closure" (being applied
to the function) compared with the differences between class and
instance variables?
For a little more fun, try expanding Test with:
def __init__( self ):
self.x = "something else"
What happens when you look at Test.__dict__?
What happens after instantiation:
t = Test()
print( t.__dict__ )
For extra credit: how does this change if we try modifying attributes
from 'outside' the class definition?
t.x = 3.333333
Are they all 'the same' or 'all different'?
A question from me: (I'm not an O-O 'native' having taken to it long
after first learning 'programming') I've used class attributes to hold
'constants', eg
MAXIMUM_WEIGHT = 100
Thus only an assignment to which reference/assertions will be made 'later'.
I have initialised a counter to zero and then incremented within the
instantiated object's __init__(), ie keeping track of how many of 'these
objects' have been instantiated.
So, I can imagine taking a value from outside the class' namespace,
modifying it in some way (per the first "x = x+1") and then retaining
the result as a class attribute (a calculation performed once - when the
class code is compiled).
However, (after that first calculation/definition of the class
attribute) why would one (normally) want to redefine the same class
attribute (the second x = x+1), at the 'class level'?
(perhaps just done for its amusement value?)
--
Regards =dn
--
https://mail.python.org/mailman/listinfo/python-list