我的代码中有以下类结构:
一个超类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中是可行的还是编码错误?
答案 0 :(得分:1)
首先,我没有看到将B
定义为A
的子类的重点。它们似乎不共享功能,您在B
和A
之间(在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()
简单得多。如果你做想要使用一个类,你需要向我们展示为什么使用一个类是可取的。