为了更清楚我需要什么,这是一个例子: 我有两个盒子,每个盒子有两个项目。 并且,我希望项目由它自己的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 for box2之前检查,box1.id
的输出为1。
但在调用Box后,box1.id
的输出变为2。
任何人都可以解释为什么我把输出作为2,但我期望的是1。
答案 0 :(得分:2)
项目包含在框中的事实并不意味着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,因此很清楚哪个是哪个。)
答案 1 :(得分:2)
有点难以理解你在帖子中想要达到的目标,但我会尝试给你一些关于我认为你想要做的事情的例子。
让我们首先关注Box
- 类,暂时忽略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
代替框。
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。它可以完成如下:
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
。