あなたの投稿から何を達成しようとしているのかを理解するのはちょっと難しいですが、あなたがやろうとしていることの例を挙げてみます.
-classだけに焦点を当てることから始めましょう。今のところBox
は無視しItem
てください。ここにあなたが持っているものがあります:
class Box():
id = 0
def __init__(self,id):
Box.id = id
def __get__(self):
return Box.id
__get__
メソッドは役に立たないので、ここでは使用しないでください。必要ありません。ここで気づいたのは、 set ですBox.id = 0
。これは、 を呼び出して を出力できることを意味しprint(Box.id)
ます0
。また、新しいボックス インスタンスを初期化し、 を呼び出すこともできますprint(box_instance.id)
。これも期待どおりに印刷0
されます。
ただし、__init__
メソッドでBox.id
は、インスタンス自体の ID の代わりに を変更しますが、これは意図したことですか? コードで何が起こるかについての簡単な例を次に示します。
In: Box.id
Out: 0
a = Box(1)
In: a.id
Out: 1
In: Box.id
Out: 1
b = Box(2)
In: b.id
Out: 2
In: a.id
Out: 2
In: Box.id
Out: 2
ここでわかるように (または自分でテストしてください)、新しいBox
オブジェクトを初期化Box
すると、インスタンスの ID ではなく、クラスの ID が変更されます。このように、新しいインスタンスを初期化すると、すべてのインスタンスの ID が変更されますBox
。これは、実際にはインスタンスの ID ではなく、の ID であるために発生しますBox
。
これが必要な動作である場合は、自由に使用してください (まだ必要ありません__get__
)。ただし、各 Box に一意の ID を持たせたい場合はself
、box の代わりに使用します。
class Box:
id = 0 # This is Box class' id, it's not even necessary to define it
def __init__(self, id): # This will be each instance's unique id
self.id = id #self.id means the instance's unique id
ほぼ完了したのでBox
、 の作業を開始できItem
ます。これで何を達成しようとしているのかはよくわかりませんが、コードを見ると、実際には各アイテムに一意の ID を与えようとしているようです (これは良い考えです)。box_id
単純Box.id
に、クラスの ID 自体を指定しますか? これは私には意味がありません。
私が実際にあなたが達成しようとしていると思うこと: 項目をボックスに挿入し、この方法で、項目が「親」ボックスの ID であることを認識させます。次のように実行できます。
class Item: #Notice how inheriting is not needed at all!!
def __init__(self, id, parent):
self.id = id
self.parent = parent
# I prefer calling it parent, call it what ever you want, box works too
今私が提案したいのは、次のとおりです。
- の中
Box.__init__()
で、リストを定義しますself.items = []
- 内で、親の項目
Item.__init__()
に追加します。self
self.parent.items.append(self)
このようにして、アイテムはどのボックスに入っているかを認識し、ボックスはどのアイテムが入っているかを認識します。
編集:親の使用方法に関する短いコード例:
box1 = Box(1) #box1 has id of 1
box2 = Box(2) #box2 has id of 2
item1 = Item(3, box1) #item1 has id of 3, parent box1
item2 = Item(4, box2) #item2 has id of 4, parent box2
item3 = Item(5, box1) #item3 has id of 5, parent box1
In: item1.id
Out: 3
In: item1.parent.id
Out: 1
In: item2.id
Out: 4
In: item2.parent.id
Out: 2
In: item3.id
Out: 5
In: item3.parent.id
Out: 1
In: item3.parent == item1.parent
Out: True
ここでわかるように、item はその親のメソッドを直接呼び出して、その属性を使用できます。このようにして、ボックスに複数のアイテムを含めることができ (両方item1
ともitem3
同じ親を持つ)、それらのアイテムのそれぞれのparent
属性がボックスを指します。
基本的に、コードで呼び出したものもitem1.parent == box1
そうです。item1.parent.id
item.box_id