[Tutor] critique my script!

Kent Johnson kent37 at tds.net
Thu Jun 22 03:15:10 CEST 2006


Christopher Spears wrote:
> I can apparently call the functions sometimes without
> ().  Why is that?

There is an important difference between f and f() - f is a reference to 
the function object itself, while f() is a *call* of the function. (Call 
is actually an operator, written (). You can write your own callable 
objects!) Functions are "first-class objects" in Python. That means that 
functions are values. They can be assigned to names, passed to 
functions, stored in data structures, etc. This is very useful in many 
ways, and requires that there be a way to get the function value.

For example, here is a simple function:

In [1]: def f():
    ...:     print 'f here'
    ...:     return 3
    ...:

Calling f has a side effect - it prints - and it also returns a value - 3.
In [2]: f()
f here
Out[2]: 3

This calls the function and assigns the return value to the variable x.
In [3]: x = f()
f here

In [4]: x
Out[4]: 3

The bare name 'f' is a reference to a function object:
In [5]: f
Out[5]: <function f at 0x00E8CCF0>

This can also be assigned:
In [6]: y = f

Now the name 'y' is a reference to the same function:
In [7]: y
Out[7]: <function f at 0x00E8CCF0>

Calling y is the same as calling f because it refers to the same function.
In [8]: y()
f here
Out[8]: 3

I hope that helps!

In an earlier email you wrote,
> One of my main areas of confusion
> is that I have seemed similar scripts written without
> 'self.button' or 'self.box'.  The programmer simply
> uses 'button' or 'box' instead.

When you write self.button, you are storing the value as an attribute of 
the class instance the method was called on. This attribute will persist 
as long as the instance does (unless you delete it yourself) and can be 
used in other instance method. If you write just button, the value is 
stored in a local variable and will be discarded when the method exits.

For example, here is a simple class:

In [9]: class F(object):
    ...:     def __init__(self, a, b):
    ...:         self.x = a
    ...:         y = b
    ...:     def show(self):
    ...:         print 'F.x =', self.x
    ...:
    ...:

In [11]: f=F(1,2)

The parameter passed as a is saved as f.x:
In [12]: f.x
Out[12]: 1

There is no f.y, the variable y only exists within the __init__() method:
In [13]: f.y
--------------------------------------------------
exceptions.AttributeError

D:\<ipython console>

AttributeError: 'F' object has no attribute 'y'

f.x is accessible in other methods:
In [14]: f.show()
F.x = 1

In the case of your original script, you don't refer to any of the 
variables outside __init__(), so there is no reason for them to be 
attributes, they can all be local variables. In general, if you don't 
need the value outside the method, just store it in a local variable.

HTH,
Kent



More information about the Tutor mailing list