Python 如何自动获取子系统的父Id
为了更清楚地了解我需要什么,以下是一个示例: 我有两个盒子,每个盒子有两件东西。 而且,我希望该项由它自己的id和它的box\u id定义。 我希望box_id是全局的,因为它将在box类的其他方法中使用 我不想显式地为孩子设置父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):
文件>>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。您需要将父级作为参数传递-没有更好的方法可以做到这一点。你为什么反对它?