これが私がそれを行う方法です(ただし、あなたのコードは私にとってはうまく機能しますが、問題を観察するために実際に実行しているコードではないと思います)。
class Feature(object):
counter = 0
def __init__(self):
self.id = Feature.counter
Feature.counter += 1
Feature必要に応じてtype(self)(または、同じもの) に置き換えることができself.__class__ますが、サブクラスが存在する場合は動作が異なることに注意してください (実際にはそれが問題なのかもしれません)。
クラス/インスタンス変数を使用するためのルールは、Python では非常に単純であり、覚えておくと役立ちます。
- で属性の値を読み取ると
self.name、 のクラスにフォールバックし、に という名前の属性が直接含まれていないself場合は基本クラス階層にフォールバックします。selfname
self.name = ... 属性の値をalwaysで書き込むと、にname直接バインドされselfます。
特に、値を書き込む場合、同じ属性への読み取りが割り当ての前にどこに行ったかは問題ではありません。
したがって、実際のプログラムで のサブクラスをインスタンス化している場合は、次の行Featureを呼び出します。Sub
self.__class__.counter = self.__class__.counter + 1
おそらくあなたが期待することをしないでしょう。( のインスタンスを初めて作成するとき)から読み取りますが、 に書き込みます。その後、読み取りが行われるため(現在存在するため)、インスタンスの ID は増加しますが、 の値は増加しないため、 の他のサブクラスのインスタンスは重複した ID を取得できます。Feature.counterSubSub.counterSub.counterSubFeature.counterFeature
したがって、名前空間に存在するグローバル変数としてFeature.counter考えていた場合に使用し、のすべてのサブクラスで同じカウンターを共有したかったのです。のすべてのサブクラスに独自の独立したカウンターがあると予想される場合に使用します(ただし、それらを初期化するために何かをする必要があります)。counterFeatureFeaturetype(self).counterFeature