Instance variables question

Chris Angelico rosuav at gmail.com
Mon Apr 16 14:05:14 EDT 2018


On Tue, Apr 17, 2018 at 3:34 AM, Peter Otten <__peter__ at 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 :)

ChrisA



More information about the Python-list mailing list