如何通过子类实例访问父类变量?

2 投票
3 回答
5583 浏览
提问于 2025-04-16 02:51

我想知道如何通过子类的对象来访问父类的变量。如果这样说有道理的话,我想补充一下,有些变量是用这种 __变量名 的方式定义的。每当我想用子类的对象来访问这些变量时,Python 就会说这个类型为子类的对象没有定义。我想知道我该怎么解决这个问题?

我还想补充一下,父类并没有明确地定义,而是从一个模块中导入的。

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' 对象没有属性 'nrows'

我想了解一下这个类变量调用的语法。因为我看到属性 nrow 已经在 Worksheet 类的构造函数中定义了。

3 个回答

0

在对象实例中,没有单独的基类实例字典。正如第

Worksheet.__init__(self)

行所说,AcuExcelSheet 的对象是由 Worksheet 类初始化的。你需要做的就是,如果想访问被重写的基类方法,可以直接使用

super(AcuExcelSheet,self).method_name

这个表达式。所以,如果你在子类实例中找不到某些属性,可能是需要额外的初始化。

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)

。)

4

有些地方出问题了,但问题不在你展示的代码上。如果 Worksheet 确实定义了 .nrows,那么你的 AcuExcelSheet 应该能访问到它。这里有几种可能性:

  1. Worksheet 并没有定义 nrows。你提到过双下划线的名字。你确定它不是 __nrows 吗?
  2. Worksheet 定义了 nrows,但只在某些代码路径下有效,而你调用构造函数时并没有走到那些代码路径。

撰写回答