如何通过子类实例访问父类变量?
我想知道如何通过子类的对象来访问父类的变量。如果这样说有道理的话,我想补充一下,有些变量是用这种 __变量名 的方式定义的。每当我想用子类的对象来访问这些变量时,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
应该能访问到它。这里有几种可能性:
Worksheet
并没有定义 nrows。你提到过双下划线的名字。你确定它不是__nrows
吗?Worksheet
定义了 nrows,但只在某些代码路径下有效,而你调用构造函数时并没有走到那些代码路径。