如何通过Python中的子类实例访问基类变量?

时间:2010-08-16 14:20:23

标签: python inheritance

我想知道如何使用子类的对象访问超类的变量 如果有任何意义,我补充一些变量是以__变量名称方式定义的。任何时候我想用子对象访问变量。 Python说这里没有定义CHILE CLASS TYPE类型的对象。我想知道如何解决这个问题? 我还想补充说,超类没有明确定义,只是从模块中导入。

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 range_index in range(sheet.nrows): AttributeError:'AcuExcelSheet'对象没有属性'nrows'

我想知道这个类变量调用的语法。因为我可以看到属性nrow已经在Worksheet类的构造函数中定义。

3 个答案:

答案 0 :(得分:4)

出了点问题,但不是你所展示的代码。如果Worksheet真正定义.nrows,那么您的AcuExcelSheet将可以访问它。有几种可能性:

  1. Worksheet没有定义nrows。你提到双下划线的名字。你确定它不是__nrows吗?
  2. Worksheet定义了nrows,但仅限于某些代码路径,并且您对构造函数的调用不会触及这些代码路径。

答案 1 :(得分:2)

如果我误解了某些内容,请原谅我,但是子类是否会自动继承超类的方法?请参阅此示例:

>>> 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'

因此超类A的 init 方法设置data属性。 B是子类,B的实例自动初始化data属性。

我的意思是,这部分对我来说似乎完全没用:

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

(至于其他人,我同意评论者的意见,你需要使用内省或找到文档来找出Worksheet具有哪些属性 -

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

答案 2 :(得分:0)

对象实例中没有分离的基类实例字典。作为行

Worksheet.__init__(self)

表示AcuExcelSheet的对象由Worksheet类初始化。所有你可能需要 - 访问基类方法,重新定义,你可以只通过

super(AcuExcelSheet,self).method_name

表达。因此,如果您在子类实例中找不到某些属性,可能需要进行一些额外的初始化。