Reputation: 29
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.
Upvotes: 2
Views: 5602
Reputation: 16308
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.
Upvotes: 0
Reputation: 375484
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:
Worksheet
doesn't define nrows. You mention double-underscore names. Are you sure it isn't __nrows
?Worksheet
defines nrows, but only for some code paths, and your invocation of the constructor doesn't hit those code paths.Upvotes: 4
Reputation: 7519
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)
.)
Upvotes: 2