从你的帖子中理解你想要实现的目标有点困难,但我会试着给你一些我认为你想要做的例子。
让我们从只关注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。这样,如果您初始化一个新的实例,每个实例的 id 都会发生变化Box
。这是因为它实际上不是实例的 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
现在我还建议的是:
- 在里面
Box.__init__()
,定义一个列表self.items = []
- 在里面
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 可以直接调用它的父方法并使用它的属性。这样,您可以在一个盒子中拥有多个项目,(item1
并且item3
两者都具有相同的父项)并且每个项目的parent
属性都指向该盒子。
基本上你在代码中调用的也是item1.parent == box1
如此。item1.parent.id
item.box_id