0

セットに保持するオブジェクトを表すクラスがあります。クラス自体に作成した数を記憶させて、呼び出したときに一意のインデックスを受け取る新しいオブジェクトが作成されるようにしたいと思いSetObject()ます__init__()。たぶん、このようなもの

class SetObject(object):
  # static class variable 
  object_counter = 0

  def __init__(self, params):
    self.params=params
    self.index = self.get_index()

  def get_index(self):
    object_counter += 1
    return object_counter-1

a = SetObject(paramsa)
b = SetObject(paramsb)
print a.index
print b.index

生み出すだろう

0
1

またはこのようなもの。現在、このアプローチでは「割り当て前に参照された変数」エラーが発生するようです。

4

3 に答える 3

3

あなたは書く必要があります:

  def get_index(self):
     SetObject.object_counter += 1
     return SetObject.object_counter-1

それ以外の場合は、object_counter がグローバル変数である場合にのみ機能します。

于 2012-12-17T08:57:00.057 に答える
2

クラスの変数を参照するには、クラスへの参照を使用する必要があります。クラス メソッドを (@classmethodデコレータと共に) 使用することもできますが、実際にはその必要はありません。

itertools.count()フールプルーフの「静的」カウンターを取得するために使用することをお勧めします。クラス属性に再割り当てする必要はありません。

import itertools

class SetObject(object):
   object_counter = itertools.count().next

   def __init__(self, params):
       self.params=params
       self.index = self.object_counter()

(上記のコードは Python 2 を想定しています。Python 3 では、イテラブルには.nextメソッドがなく、functools.partial(next, itertools.count())代わりに使用する必要があります)。

カウンターは反復子であるため、割り当てる必要はまったくありませんSetObject.object_counter。サブクラスは、必要に応じて独自のカウンターを提供するか、親クラスのカウンターを再利用できます。

于 2012-12-17T09:11:42.357 に答える
1

この線

object_counter += 1

に変換します

object_counter = object_counter + 1

スコープ内 (関数内など) の変数に代入すると、Python は新しいローカル変数を作成したいと想定します。そのため、ローカルとしてマークobject_counterされます。つまり、その値を取得しようとすると (値を追加するために)、「定義されていません」というエラーが発生します。

これを修正するには、どこを検索するかを Python に指示しますobject_counter。一般に、これにはglobalornonlocalキーワードを使用できますが、あなたの場合は、クラスで検索したいだけです:

self.__class__.object_counter += 1
于 2012-12-17T08:57:59.977 に答える