NEWBIE: Sub-Classes
Gabriel Genellina
gagenellina at softlab.com.ar
Tue Dec 30 23:07:10 EST 2003
At 30/12/2003 17:40, you wrote:
>I'm a bit baffled. In the code below, I expected that the import in
>tst_sub.py would expose all the
>contents of dir_a.py. But, as it turns out...it doesn't.
"import dir_a" puts dir_a into the module's namespace, so dir_a has a
meaning from this point on. It's not the same as "from dir_a import *"
which puts all public symbols from dir_a into the module's namespace.
A simple example: the builtin module math contains a sqrt() function. You
can use:
import math
print math.sqrt(2)
or:
from math import sqrt
print sqrt(2)
or:
from math import *
print sqrt(2)
The last form is not recommended; the second is the best way (as it makes
explicit what you are importing, and from where)
>I can understand (I think) why B has to be qualified in class A(dir_a.B),
Good, the answer should be: "because I imported dir_a".
If you had written: from dir_a import B, then you could use B alone
wherever you use dir_a.B now.
>but why is dir_a.B.class_B
>required?
You have two things named 'class_B': one is an attribute of class B (*not*
an instance attribute); another is an attribute of B instances that only
exists after executing the method B_method_1
Class attributes act like defaults for instance attributes in a "get"
context: if b is an instance of class B, b.class_B == 21 before executing
B_method_1, and b.class_B == 19 after.
b.class_B = 19 *creates* an instance attribute named "class_B" with value
19; you never modify the class attribute this way. (You could do that, of
course, if that's what you really want to do).
>Also, how can I expose self.B_self to A?
In Python you must *explicitely* call the inherited __init__ method.
class A(dir_a.B):
def __init__ (self):
dir_a.B.__init__(self)
...
Then, you can access self.B_self (which is initialized in B.__init__) as usual.
Read the Python tutorial about these topics, it's good.
Gabriel Genellina
Softlab SRL
More information about the Python-list
mailing list