Chris Angelico wrote: > On Tue, Apr 17, 2018 at 3:34 AM, Peter Otten <__pete...@web.de> wrote: >> Irv Kalb wrote: >> >>> I have been writing OOP code for many years in other languages and for >>> the >>> past few years in Python. I am writing new curriculum for a course on >>> OOP >>> in Python. In order to see how others are explaining OOP concepts, I >>> have >>> been reading as many books and watching as many videos as I can. I've >>> been watching some videos created by Dr. Chuck Severance in a series >>> called "Python For Everyone". I think "Dr. Chuck" is an excellent >>> teacher and I think his videos are outstanding. >>> >>> Today I watched this video: >>> https://www.youtube.com/watch?v=b2vc5uzUfoE >>> <https://www.youtube.com/watch?v=b2vc5uzUfoE> which is about 10 minutes >>> long. In that video he gives a very basic overview of OOP and classes. >>> He gives a demonstration using the following example: >>> >>> class PartyAnimal(): >>> x = 0 >>> >>> def party(self): >>> self.x = self.x + 1 >>> print('So far', self.x) >>> >>> an = PartyAnimal() >>> an.party() >>> an.party() >>> an.party() >> >> This style is rather brittle. Consider the following variant: >> >>>>> class A: >> ... x = "" >> ... >>>>> a = A() >>>>> b = A() >>>>> a.x += "a" >>>>> a.x += "a" >>>>> b.x += "b" >>>>> a.x >> 'aa' >>>>> b.x >> 'b' >>>>> A.x >> '' >> >> Seems to work. Now let's change x to something mutable: >> >>>>> A.x = [] >>>>> a = A() >>>>> b = A() >>>>> a.x += "a" >>>>> a.x += "a" >>>>> b.x += "b" >>>>> a.x >> ['a', 'a', 'b'] >>>>> b.x >> ['a', 'a', 'b'] >>>>> A.x >> ['a', 'a', 'b'] >> >> Conclusion: don't do this except to learn how attributes work in Python. > > Be careful: Your example looks nice and tidy because you're adding > single-character strings onto a list. They happen to work as you'd > expect. Normally, though, if you're adding onto a list, you probably > want to use another list: > > a.x += ["a"] > > But you've successfully - if partly unwittingly - shown how hairy this can > be :)
That was not an accident -- it was an attempt to make the two examples look as similar and harmless as possible. If the use of strings as a sequence distracts you use tuples instead: >>> class A: ... x = () ... >>> a = A() >>> b = A() >>> a.x += "alpha", >>> a.x += "alpha", >>> b.x += "beta", >>> a.x ('alpha', 'alpha') >>> b.x ('beta',) >>> A.x () >>> A.x = [] >>> a = A() >>> b = A() >>> a.x += "alpha", >>> a.x += "alpha", >>> b.x += "beta", >>> a.x ['alpha', 'alpha', 'beta'] >>> b.x ['alpha', 'alpha', 'beta'] >>> A.x ['alpha', 'alpha', 'beta'] -- https://mail.python.org/mailman/listinfo/python-list