如何自动获取子项的父ID

时间:2012-12-01 09:48:20

标签: python oop class object

为了更清楚我需要什么,这是一个例子: 我有两个盒子,每个盒子有两个项目。 并且,我希望项目由它自己的id定义,它是box_id。 我希望box_id是全局的,因为它将用于Box类的其他方法。

我不想显式设置子节点的父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 for box2之前检查,box1.id的输出为1。 但在调用Box后,box1.id的输出变为2。

任何人都可以解释为什么我把输出作为2,但我期望的是1。

2 个答案:

答案 0 :(得分: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,因此很清楚哪个是哪个。)

答案 1 :(得分:2)

有点难以理解你在帖子中想要达到的目标,但我会尝试给你一些关于我认为你想要做的事情的例子。

让我们首先关注Box - 类,暂时忽略Item。 这就是你拥有的:

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

    def __get__(self):
        return Box.id

__get__方法没用,只是不在这里使用它,你不需要它。 现在我们注意到,您设置了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。 这样,如果您初始化一个新的Box -instance,每个实例的id都会更改。 这是因为它实际上不是实例的id,而是Box的id。

如果这是您想要的行为,请随意使用它(您仍然不需要__get__),但如果您希望每个Box都有其唯一ID,请使用self代替框。

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。它可以完成如下:

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__()内,将self附加到父项的内容中。 self.parent.items.append(self)
  3. 通过这种方式,您的商品就会知道他们所在的方框,并且方框知道哪些商品在其中。


    编辑:有关如何使用父级的简短示例代码:

    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可以直接调用它的父方法并使用它的属性。 这样,您可以在一个方框中放置多个项目,(item1item3都有相同的父级),并且每个项目的parent属性都指向该框。

    基本上item1.parent == box1因此item1.parent.id就是您在代码中调用的item.box_id