views:

158

answers:

3

I wanted to know how to access to the super class’s variables with a object of child class If it makes any sense I add that some of the variables are defined in this __variable name way. Any time I want to access the variables with a child object. Python says the object with the type CHILE CLASS TYPE here is not defined. I wanted to know how I can solve this? I also want to add that the super class is not explicitly defined and it is just imported from a module.

class AcuExcelSheet (  Worksheet  ):  ## super class which is imported from module 
    def __init__(self):
        Worksheet.__init__(self)

sheet = AcuExcelSheet()
for row_index in range(sheet.nrows):
        for col_index in range(sheet.ncols):
            print sheet.cell(row_index,col_index).value

for row_index in range(sheet.nrows): AttributeError: 'AcuExcelSheet' object has no attribute 'nrows'

I want to know about the syntax of this class variable’s call. Because I can see that attribute nrow has been defined in the constructor of Worksheet class.

A: 

Forgive me if I'm misunderstanding something, but doesn't the child class automatically inherit the methods of the super class? See this for example:

>>> class A(object):
...     def __init__(self):
...             self.data = "GIMME TEH DATA"
... 
>>> a = A()
>>> a.data
'GIMME TEH DATA'
>>> class B(A):
...     pass
... 
>>> b = B()
>>> b.data
'GIMME TEH DATA'

So the superclass A's init method sets the data attribute. B is the child class, and an instance of B has automatically the same data attribute initialised.

What I mean to say from this is that this part seems entirely unnecessary to me:

def __init__(self):
    Worksheet.__init__(self)

(As for the rest I agree with the commenter that you'd need to either use introspection or find documentation to find out what attributes Worksheet has -- something along the lines of

>>> a = Worksheet()
>>> print dir(a)

.)

chryss
+4  A: 

Something is wrong, but not with the code you've shown. If Worksheet truly defines .nrows, then your AcuExcelSheet will have access to it. There are a few possibilities:

  1. Worksheet doesn't define nrows. You mention double-underscore names. Are you sure it isn't __nrows?
  2. Worksheet defines nrows, but only for some code paths, and your invocation of the constructor doesn't hit those code paths.
Ned Batchelder
The double-underscore prefix will mangle the name by adding the class name to it, e.g. `__nrows` in `AcuExcelSheet` would become `_AcuExcelSheet__nrows` http://docs.python.org/tutorial/classes.html#private-variables
Nick T
A: 

There's no separated base class instance dictionary in object instances. As line

Worksheet.__init__(self)

says objects of AcuExcelSheet are initialized by Worksheet class. All may you need - to access base class method, that was redefined, you can do it just by

super(AcuExcelSheet,self).method_name

expression. So if you can't find some attributes in child class instance, maybe it needs some additional initialization.

Odomontois