I noticed a behaviour in python class creation that is strange, to say
the least.
When creating a class with data members but no __init__ method. Python
deals differently with data members that are muatable and immutables.
Ex:
class A(object):
stringData = "Whatever"
listData = []
instance = A()
Will have data members instantiated as expected (instance.stringData ==
"Whatever" and instance.listData == [])
instance.listData.append("SomeString")
instance.stringData = "Changed"
Now if I do
secondInstance = A()
it will come with the listData containing the SomeString appended to the
instance...
this is clearly not normal
Especially that the stringData of Second instance contains the
"Whatever" text. If the behaviour was at least consistant... but it is
not...
Am I coing nuts or is this by desing, if so it is very misleading...
The two instances are sharing the same list, but not the same string
... I did not declare the list to be static in any way.... Why does it
behave like this ?
Éric
> When creating a class with data members but no __init__ method. Python
> deals differently with data members that are muatable and immutables.
no, it doesn't. it's your code that deals with them in different ways,
not Python.
> Ex:
> class A(object):
> stringData = "Whatever"
> listData = []
>
> instance = A()
>
> Will have data members instantiated as expected (instance.stringData ==
> "Whatever" and instance.listData == [])
>
> instance.listData.append("SomeString")
here, you call a method on the class object. this method modifies the
object.
> instance.stringData = "Changed"
here, you use assignment to *add* a new attribute to the instance.
the class attribute is still there, but it's shadowed by an instance
attribute with the same name.
</F>
>> instance.stringData = "Changed"
>>
>
> here, you use assignment to *add* a new attribute to the instance.
>
> the class attribute is still there, but it's shadowed by an instance
> attribute with the same name.
>
> </F>
>
yep... got it...
guess the Java-C++ views on things kinna creapt on me there...
Thanks for clearing that up :-)
It is humbling to see how simple yet powerfull python`s view on things
is....
Éric
inst = A()
print inst.stringData
print inst.listData
print
inst.listData.append("SomeString")
inst.stringData = "Changed"
inst2 = A()
print inst2.stringData
print inst2.listData
print
inst.listData.append("NewThing")
inst.stringData = "NewChanged"
print inst.stringData
print inst.listData
print inst.stringData
print inst.listData
print
-----
Whatever
[]
Whatever
['SomeString']
NewChanged
['SomeString', 'NewThing']
NewChanged
['SomeString', 'NewThing']
Isn't this what you got?
-Chetan
>When creating a class with data members but no __init__ method. Python
>deals differently with data members that are muatable and immutables.
See
<http://zephyrfalcon.org/labs/python_pitfalls.html> specially items 4 and 5.
And <http://www.effbot.org/zone/python-objects.htm>
--
Gabriel Genellina
Softlab SRL
__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
¡Abrí tu cuenta ya! - http://correo.yahoo.com.ar
+1 QOTW