On 13/11/2020 08:47, Alan Bawden wrote:
[email protected] (Stefan Ram) writes:
I expected this solution:
class Main:
def __init__( self ):
self.value = 0
def count( self ):
self.value += 1
but a student turned in the following solution:
class Main:
value = 0
def count(self):
self.value += 1
I thought that the solution of the student had a shortcoming
but I was not able to put my finger on it. Can you?
Not exactly a shortcoming, but the fact that it works as a solution to
your problem may cause the student to someday write something like:
class Main:
value = []
def add(self, x):
self.value += [x]
and be suprised by the resulting behavior.
You are right to be concerned - although largely because the differences
between class-variables and instance-variables is (sadly) one of those
topics poorly-understood by many, and thus best avoided simply to
prevent confusion. (I'll be the first to concur that this not a good
reason, and particularly not for someone in education/training, but
that's life ["as we know it, Jim"])
A worthwhile read is: https://docs.python.org/3/tutorial/classes.html
(including @Alan's most-pertinent warning of the subtleties introduced
by mutable data-structures)
On the other hand, Python has long?always had an aversion to the
object-induced 'boiler-plate' required in other languages - and I have
to say, even building Python classes with __init__(), __str__(), and
__repr__() etc "magic methods", can seem a slog for low return-value.
AFTER teaching/learning about the 'classic form', you may like to
consider DataClasses (Python 3.7+). These look very similar to your
student's submission. One of their objectives is to cut-through a load
of the boiler-plate - in many circumstances.
https://www.python.org/dev/peps/pep-0557/
https://docs.python.org/3/library/dataclasses.html
See also Counter Objects:
https://docs.python.org/3/library/collections.html#counter-objects
--
Regards =dn
--
https://mail.python.org/mailman/listinfo/python-list