Python类中的“元”关系

2024-04-20 00:52:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试用以下方式创建两个类:

class A:

    def __init__(self, n):

        self.Bs = [B(i,self) for i in range(n)]

class B:

    def __init__(self, i, a):

        self.i = i
        self.a = a

        print(a.Bs) # this line throws an error

当我拿出打印语句时,一切都很顺利:

a = A(2)

a.Bs

→ [<__main__.B at 0x10d45c0d0>, <__main__.B at 0x10d45c490>]


(a.Bs[0].a == a) & (a.Bs[1].a == a)

→ True

当我试图在类B的构造函数中访问A的.Bs属性时(例如在print语句中),就会出现问题


Tags: inselfforbsinitmaindef方式
1条回答
网友
1楼 · 发布于 2024-04-20 00:52:10

正如@user10987432所指出的,当您尝试print(a.Bs)时,a.Bs还不存在。Python首先必须计算右侧的列表理解,然后将其分配给左侧的变量。我不知道你想做什么,但也许这有帮助?在{}中,执行以下操作:

def __init__(self, n):
    self.Bs = []
    for i in range(n):
        self.Bs.append(B(i,self))

这样一来,a.Bs从一开始就存在,并且随着所有Bs的创建而改变:

>>> a = A(4)
[]
[<__main__.B object at 0x7f690b281518>]
[<__main__.B object at 0x7f690b281518>, <__main__.B object at 0x7f690b281550>]
[<__main__.B object at 0x7f690b281518>, <__main__.B object at 0x7f690b281550>, <__main__.B object at 0x7f690b281588>]

请注意每次调用B.__init__时打印是如何被调用的,以及列表是如何随着创建更多Bs而增长的

相关问题 更多 >