【问题标题】:How to get the parent Id of the child automatically [closed]如何自动获取孩子的父ID [关闭]
【发布时间】:2012-12-01 09:48:20
【问题描述】:

为了更清楚我需要什么,这里有一个例子: 我有两个盒子,每个盒子有 2 件物品。 而且,我希望该项目由它自己的 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 调用 Box 之前进行了检查,box1.id 的输出为 1。 但调用 Box 后,box1.id 的输出变为 2。

谁能解释一下为什么我在这里得到的输出是 2,但我期望的是 1。

【问题讨论】:

  • 与你所说的相反,Item 不是Box 的子类
  • 另外,您能否稍微扩展一下您实际上想要实现的目标
  • 项目是缩进的,它不是让它成为一个子类吗?
  • 术语“子类”是指A继承自B,而不是嵌套在其中。
  • 如果您解释了您尝试使用此构造解决的问题,我们将能够更好地为您提供帮助。

标签: python oop class object


【解决方案1】:

项目包含在一个盒子中这一事实并不意味着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,所以很清楚哪个是哪个。)

【讨论】:

  • 投反对票的人愿意解释一下吗?
  • 如果我必须将 box2 作为变量传递,我根本不需要这个。
【解决方案2】:

从你的帖子中理解你想要达到的目标有点困难,但我会试着给你一些我认为你想要做的例子。

让我们从只关注Box-class 开始,暂时忽略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 而不是 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__() 中,将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 可以直接调用它的父级方法并使用它的属性。 这样您就可以在一个盒子中拥有多个项目(item1item3 都具有相同的父项)并且每个项目的 parent 属性都指向该盒子。

基本上item1.parent == box1 所以item1.parent.id 就是您在代码中所称的item.box_id

【讨论】:

  • 我怎么知道父母。在实际问题中,我不知道 Item 的父级,我希望程序从程序中继承它的父级 ID。我做到了,但它到达了最新定义的父级。就您的代码而言,我完全希望a.id 的输出为1。
  • 您需要将父级作为参数传递 - 没有比这更好的方法了。你为什么反对它?
猜你喜欢
  • 2020-08-11
  • 2022-11-24
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 2018-08-27
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多