Trying to understand a little python
Jeremy Jones
zanesdad at bellsouth.net
Mon Dec 6 14:48:57 EST 2004
McCarty, Greg wrote:
> Ok, I'm new to python, and I'm trying to come to grips with a few
> things. Got
>
> lots of years of experience with Java and asp/aspx, etc. Trying to relate
>
> Python's behavior to what I already know.
>
>
>
> Here's the python code (line #'s added for my question) -
>
>
>
> 01 class Tester:
>
> 02 def __init__ (self):
>
> 03 print "I'm initializing Tester"
>
> 04
>
> 05 def test(klass=Tester):
>
> 06 klass.stuff = "setting stuff"
>
> 07 print "I'm in test: " + klass.stuff
>
> 08
>
> 09 test() # results 1: I'm in test: setting stuff
>
> 10 a=Tester() # results 2: I'm initializing Tester
>
> 11 a.stuff # results 3: 'setting stuff'
>
> 12 b=Tester() # results 4: I'm initializing Tester
>
> 13 b.stuff # results 5: 'setting stuff'
>
> 14 a.stuff="changed!"
>
> 15 b.stuff # results 6: 'setting stuff'
>
> 16 a.stuff # results 7:'changed!'
>
>
>
> And here's my questions -
>
>
>
> Line 09 - I expected the default argument assignment of line 05 to
>
> create an object of type Tester and assign it to the var klass. Thus I
>
> expected Tester.__init__ to fire, which it didn't. What does
> 'klass=Tester'
>
> actually do on line 05?
>
>
>
klass=Tester sets the default value of the variable klass to the *class*
Tester. This isn't creating an instance of Tester. Only pointing klass
to the class itself.
> Line 10 - Seems that the syntax 'Tester()' actually causes the
> __init__ method to
>
> fire. Is this the only case?
>
Mostly. You can use getattr if you like. And probably eval or exec.
But I would try to stick with the Tester() syntax.
>
>
> Line 12 - At this point, I was thinking of Tester.stuff as a static
> variable
>
> of the Tester class.
>
When you set a.stuff to "changed", you are setting an instance attribute
on "a" to "changed". "b" is still pointing to the "static variable" on
Tester. Look at this:
In [12]: a = Tester()
I'm initializing Tester
In [13]: b = Tester()
I'm initializing Tester
In [14]: Tester.stuff
Out[14]: 'setting stuff'
In [15]: Tester.stuff = "FOOBAR"
In [16]: a.stuff
Out[16]: 'FOOBAR'
In [17]: b.stuff
Out[17]: 'FOOBAR'
In [18]: a.stuff = "A.STUFF"
In [19]: a.stuff
Out[19]: 'A.STUFF'
In [20]: b.stuff
Out[20]: 'FOOBAR'
I re-set Tester.stuff to "FOOBAR". "a" and "b" attributes "stuff" were
pointing to that for a second. Then I pointed the attribute "stuff" on
"a" to "FOOBAR".
>
>
> Line 15 - We'll, I guess stuff isn't a static variable! What is the
>
> explanation here?
>
>
>
> Thanks for any help.
>
>
>
> Greg McCarty
>
> **Senior Technical Advisor** / ManTech IST
>
> **ph: 410-480-9000 x2804 or 703-674-2804 fx: 410-480-0916**
>
>
>
HTH.
Jeremy
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20041206/eb11ecdd/attachment.html>
More information about the Python-list
mailing list