-4

何が必要かをより明確にするために、ここに例を示します。それぞれ 2 つのアイテムを持つ 2 つのボックスがあります。そして、アイテムを独自のIDとbox_idで定義したいと思います。Box クラスの他のメソッドで使用されるため、box_id をグローバルにする必要があります。

子の親 ID を明示的に設定したくありませんが、自動的に継承されるようにしたいと考えています。

私はこれを試しました:

file>> getid.py

 class Box():
    id = 0
    def __init__(self,id):
        Box.id = id

    def __get__(self):
        return Box.id

    class Item():
        def __init__(self,id):
            self.id = id
            self.box_id = Box.id
        def __get__(self):
            return self.id,Box.id

これを別のファイルで次のように使用します。

   from getid import *
   box1 = Box(1)
   box2 = Box(2)       

   In: box1.id
   Out: 2

box1 の場合、クラス Box を呼び出し、id を 1 として渡します。box2 の Box を再度呼び出す前にチェックすると、出力box1.idは 1 でした。しかし、Box を呼び出した後、出力はbox1.id2 に変わります。

ここで出力が2になる理由を誰か説明してください。しかし、私が期待するのは1です。

4

2 に答える 2

2

Item アイテムがボックス内に含まれているという事実は、クラスがBox クラス内にネストされる必要があるという意味ではありません。

これは、あなたが求めていることを行う非常に単純な構造です:

class Box(object):
    def __init__(self, box_id):
        self.box_id = box_id

class Item(object):
    def __init__(self, box, item_id):
        self.box = box
        self.item_id = item_id

box1 = Box(1)

box2 = Box(2)
item1 = Item(box2, 1)
item2 = Item(box2, 2)

(IDの名前を変更したので、どれがどれであるかが明確です。)

于 2012-12-01T10:27:26.830 に答える
2

あなたの投稿から何を達成しようとしているのかを理解するのはちょっと難しいですが、あなたがやろうとしていることの例を挙げてみます.

-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

今私が提案したいのは、次のとおりです。

  1. の中Box.__init__()で、リストを定義しますself.items = []
  2. 内で、親の項目Item.__init__()に追加します。selfself.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.iditem.box_id

于 2012-12-01T10:34:35.980 に答える