[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Quirk difference between classes and functions

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


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