Python 如何自动获取子系统的父Id

Python 如何自动获取子系统的父Id,python,oop,class,object,Python,Oop,Class,Object,为了更清楚地了解我需要什么,以下是一个示例: 我有两个盒子,每个盒子有两件东西。 而且,我希望该项由它自己的id和它的box\u id定义。 我希望box_id是全局的,因为它将在box类的其他方法中使用 我不想显式地为孩子设置父id,但我想让它自动继承 我试过这个: 文件>>getid.py class Box(): id = 0 def __init__(self,id): Box.id = id def __get__(self):

为了更清楚地了解我需要什么,以下是一个示例: 我有两个盒子,每个盒子有两件东西。 而且,我希望该项由它自己的id和它的box\u id定义。 我希望box_id是全局的,因为它将在box类的其他方法中使用

我不想显式地为孩子设置父id,但我想让它自动继承

我试过这个:

文件>>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,调用类框并将id作为1传递。 并在再次调用box2的框之前选中,
box1.id
的输出为1。 但是调用该框后,
box1.id
的输出变为2


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

项目包含在一个框中并不意味着
项目
类需要嵌套在
框中
类:

下面是一个非常简单的结构,可以满足您的要求:

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,所以很清楚哪个是哪个。)

很难理解你想从你的帖子中获得什么,但我会尝试给你举一些例子,说明我认为你想做什么

首先,我们只关注
-类,暂时忽略
。 以下是您所拥有的:

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

    def __get__(self):
        return Box.id
\uuuuu get\uuuuu
方法是无用的,只是不要在这里使用它,您不需要它。 现在我们注意到,您设置了
Box.id=0
,这意味着您可以调用
print(Box.id)
,它将打印
0
。 您还可以初始化一个新的box实例,并且可以调用
print(box\u instance.id)
,这也将按预期打印
0

但是,在您的
\uuu init\uu
方法中,您更改了
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都会发生变化。 这是因为它实际上不是实例的id,而是
框的id

如果这是您想要的行为,请随意使用它(您仍然不需要
\uuuu get\uuuu
),但如果您希望每个框都有其唯一的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

现在我们已经基本完成了
,我们可以开始处理
。 我很不确定你想用这个来实现什么,但是看看你的代码,看起来你实际上是想给每个项目一个唯一的id(这是一个好主意),然后你想给他们
box\u 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
现在我还建议:

  • 框内。\uuuu init\uuuu()
    ,定义一个列表
    self.items=[]
  • 项目内部。在父项目中附加
    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
    
    正如我们在这里看到的,项可以直接调用其父项的方法并使用其属性。 通过这种方式,您可以在一个框中包含多个项(
    item1
    item3
    都具有相同的父项),并且这些项中的每个项的
    parent
    属性都指向该框


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

    与您所说的相反,
    item
    也不是
    box
    的子类,您是否可以稍微扩展一下您使用该项实际要实现的功能,它不是一个子类吗?术语“子类”的意思是a从B继承而来,而不是嵌套在它里面。如果你解释了你试图用这个构造来解决的问题,我们会更好地帮助你。下一个投票人愿意解释吗?如果我必须把box2作为变量传递,我根本不需要这个。我怎么知道父对象。在实际问题中,我不知道项的父项,我希望程序从程序继承它的父项id。我做了,但它得到了最新定义的父。就您的代码而言,我确实希望
    a.id
    的输出为1。您需要将父级作为参数传递-没有更好的方法可以做到这一点。你为什么反对它?