如何从子类方法访问超类实例的属性

时间:2013-07-25 10:49:31

标签: python class

我的代码中有以下类结构:
一个超类A,它基本上是来自子类的对象列表B.类A有一个方法,meth,它创建一个变量var(通过从文件中读取)。变量var需要可以通过子类B的方法访问。问题是在初始化a = A()之后,var是实例a的属性,使用super的子类方法无法访问它( )。 var是一个大型的浮点数(大约1e5个元素),所以我试图通过不使它成为B实例的属性(n次!)或将其显式传递给methB来最小化内存使用。

class A(object):
  def __init__(self,n):
    self.data = [B() for _ in xrange(n)]

  def __getitem__(self,n):
    return self.data[n]

  def methA(self):
    with open('file.txt','r') as fp:
      self.var = fp.readlines()

class B(A):
  def __init__(self):
    self.derived_var = []

  def methB():
    '''This method needs to use var defined in meth of A above.'''

a = A(5)
a.methA()
for b in A:
  b.methB()

这在python中是可行的还是编码错误?

3 个答案:

答案 0 :(得分:1)

首先,我没有看到将B定义为A的子类的重点。它们似乎不共享功能,您在BA之间(在A的构造函数中)创建了可能导致问题的循环引用。

现在你的问题。将a.var传递给methB是一个问题吗?像这样:

class B(A):
  def __init__(self):
    self.derived_var = []

  def methB(self, var):
    # some code

a = A(5)
a.meth()
for b in A:
  b.methB(a.var)

答案 1 :(得分:0)

def methB(self):
    super(B, self).meth()
    print self.var

使用super()可以帮助您获取超类中定义的属性。但继承应该是 is-one 关系。你的设计不好。

答案 2 :(得分:0)

当函数足够时,不要使用类:

with open('file.txt','r') as fp:
    var = fp.readlines()

for _ in xrange(5):
    funcB()

简单得多。如果你想要使用一个类,你需要向我们展示为什么使用一个类是可取的。