0

私のコードには次のクラス構造があります:
基本的にサブクラス B からのオブジェクトのリストであるスーパークラス A. クラス A には、変数 var を作成するメソッド meth があります (ファイルから読み取ることによって) . 変数 var は、サブクラス B のメソッドからアクセスできる必要があります。問題は、a = A() を初期化した後、var がインスタンス a の属性であり、super( を使用するサブクラス メソッドからアクセスできないことです。 )。var は float の大きな配列 (約 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で可能ですか、それともコーディングが悪いですか??

4

3 に答える 3

1

まず、Bのサブクラスとして定義する意味がわかりませんA。それらは機能を共有していないようで、問題につながる可能性のあるBA(のコンストラクター内) の間に循環参照を作成します。A

さて、あなたの質問です。に渡すだけで問題はありますa.varmethB?このような:

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)
于 2013-07-25T10:55:41.560 に答える
0
def methB(self):
    super(B, self).meth()
    print self.var

を使用super()すると、スーパー クラスで定義された属性を取得するのに役立ちます。ただし、継承はis-one の関係でなければなりません。あなたのデザインは良くありません。

于 2013-07-25T10:53:59.450 に答える
0

関数で十分な場合は、クラスを使用しないでください。

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

for _ in xrange(5):
    funcB()

とても簡単です。クラスを使用したい場合は、クラスの使用が望ましい理由を示す必要があります。

于 2013-07-25T11:00:05.120 に答える