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