从你的帖子中理解你想要达到的目标有点困难,但我会试着给你一些我认为你想要做的例子。
让我们从只关注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
现在我还建议:
- 在
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。