[Twisted-Python] Why classes in twisted.protocols.basic use "static member" to store states?
Phil Mayers
p.mayers at imperial.ac.uk
Fri Mar 30 03:46:22 MDT 2007
甜瓜 wrote:
> No, I don't think so. ^_^ You can see it from the last lines in you
> recommend document:
No you can't, because you've misunderstood.
>>>> d.count
> 2
>>>> c.count
> 2
>
> Instance c & d indeed share the class attribute "count". You can try
> it more explicitly:
>>>> class A:
> ... i = 0
> ...
>>>> p = A()
>>>> q = A()
>>>> A.i = 2
>>>> p.i
> 2
>>>> q.i
> 2
> Again, instance p & q share the class attribute "i".
They share it UNTIL IT IS MODIFIED. So, to continue the above example,
the relevant bit would be:
>>> p.i=3
>>> p.i
3
>>> q.i
2
Effectively, classes in python serve as templates to create instances.
If you create two instances of a class and modify the class, then both
are modified - however, if you then modify an instance, the class and
other instances are not, and those modifications override any
conflicting ones on the class.
Continuing the above example:
>>> p.__dict__
{'i': 3}
>>> q.__dict__
{}
So, because we've modified "p", the attribute is set in the instance
dict. q remains unmodified, and the getattr call will continue through
to the class.
Doing this:
class AProtocol:
INITIALSTATE = 'foo'
..is just a quick way to get INITIALSTATE set on every instance. The
ONLY circumstance you need worry about these variables being shared is
if you use a mutable variable and mutate it in place. For example:
>>> class BProtocol:
... SOMEDATA = {}
...
>>> p = BProtocol()
>>> q = BProtocol()
>>> p.SOMEDATA['a'] = 1
>>> q.SOMEDATA
{'a': 1}
If you don't want that to happen, don't do it. Twisted doesn't.
More information about the Twisted-Python
mailing list