2016-04-13 8 views
2

私はクラスを持っています。以下に示すように、いくつかのパラメータと属性を持っています。しかし、positionの関数setterに到達し、copy()関数を実行すると、エラーメッセージが表示されます。RuntimeError:Pythonオブジェクトを呼び出すときに最大再帰深度を超過しましたdeepcopy()またはimport sys sys.setrecursionlimit(10000)のような異なるオプションを試しましたが、いずれもうまくいきませんでした。これは私のコードです:Python:コピー関数を呼び出すときにPythonオブジェクトを呼び出すときに最大再帰深度を超えました

def initCost(n): 
    a = random.randint(0,10)    #gram. 
    b = random.randint(0,5)    #price 
    return [random.randint(0,a*b) for i in range(n)] 

costs = initCost(10) 

class Particle: 
    def __init__(self, n, maxWeight): 
     self.position = [random.randint(0,1) for i in range(n)] #position 
     self.velocity = [0 for i in range(n)]     #velocity 
     #self.fit = self.fitness(self.position) 
     self.bp = self.position.copy()       #best position 
     self.bf = self.fit         #best fitness 
     self.evaluate() 

    def fit(self, x): 
     fitt = 0 
     for i in range(len(x)-1): 
      if (x[i] == 1): 
       fitt = fitt + costs[i] 
     return fitt 

    def evaluate(self): 
     """ evaluates the particle """ 
     self.fitness = self.fit(self.position) 

    @property 
    def position(self): 
     return self.position 

    @property 
    def bp(self): 
     return self.bp 

    @property 
    def bf(self): 
     return self.bf 

    @position.setter 
    def position(self, newPosition): 
     self.position = newPosition.copy() 
     #self.position = newPosition[:] 
     self.evaluate() 
     # automatic update of particle's memory 
     if (self.fit<self.bf): 
      self.bp = self.position 
      self.bf = self.fit 
+0

私はPythonのゲッターとセッターのことを100%熟知しているわけではありませんが、このクラスのオブジェクトをインスタンス化するときに最初に行うことは、 'self.position'は' list'を参照します。 – TigerhawkT3

+0

@ TigerhawkT3:いいえ、彼らは呼び出されて、もう一度呼び出されました... – user2357112

+0

@ user2357112:私が作っている間違いを教えてください。 – Nelly

答えて

3

、プロパティとそれをバックアップする通常の属性の両方の名前としてposition使用しようとしているように見えます。例えば、

@position.setter 
def position(self, newPosition): 
    self.position = newPosition.copy() 
# ^^^^^^^^^^^^^^^ 

あなたがを定義しているセッターを使用しますself.positionを設定するには、この試み!同様に、

@property 
def position(self): 
    return self.position 

このゲッターは自分自身を呼び出すだけです!

positionプロパティ定義内でself.positionを使用しようとすると、プロパティがバイパスされません。プロパティをバックアップする「通常の」属性を使用する場合は、self._positionなどの別の名前を付けてください。

関連する問題