类的顺序在使用彼此的变量时很重要



我是Python的新手,没有找到以下问题的答案:我有两个类,希望他们彼此使用变量。有没有一种简单的方法来做到这一点,因为如果我像这个类A这样的级别,就不知道B类存在。

class a:
    y=1
    print(b.x)
class b:
    x=1
    print(a.y)

以及我如何使用覆盖变量,以下代码不起作用:

class a:
    y=b.x
class b:
    x=1

您正在执行print作为类定义的一部分。在读取有关class b的零件之前,它在Python看到该行时立即执行。

相反,使用类中的功能来执行代码 已经定义了类:

class a:
    y=1
    def go():
        print(b.x)
class b:
    x=1
    def go():
        print(a.y)
a.go()
b.go()

正如我在评论中所说的那样,您的代码无法有效利用类。我认为这将是更好的方法,可以在围绕循环参考问题上工作的灵活性。

首先是class定义(遵循PEP 8命名约定指南):

class A:
    def __init__(self, value, linked_value=None):
        self.y = value
        if isinstance(linked_value, B):
            self.linked_value = linked_value.x
    def print_linked_value(self):
        print(self.linked_value)

class B:
    def __init__(self, value, linked_value=None):
        self.x = value
        if isinstance(linked_value, A):
            self.linked_value = linked_value.y
    def print_linked_value(self):
        print(self.linked_value)

类似的定义提供了两种设置循环引用的方法:

  1. 通过单独创建它们,然后明确链接它们:

    # First create instances of each class.
    a = A(1)
    b = B(42)
    # Then link them.
    a.linked_value = b.x
    b.linked_value = a.y
    a.print_linked_value()  # -> 42
    b.print_linked_value()  # -> 1
    
  2. *或*通过创建第一个而没有链接值,只剩下第二个需要手动链接。

    # First create instances of each class, but link the second to the first
    # when it's created.
    a = A(1)
    b = B(42, a)  # Create and link to first.
    # Then link the first to the second to complete the circular references.
    a.linked_value = b.x
    # Same result.
    a.print_linked_value()  # -> 42
    b.print_linked_value()  # -> 1
    

最终注释:另一种更高级的替代方案,也可以通过使用内置的property()函数作为装饰器来创建"描述符",也可以在这种情况下应用。这是一个有点相关的问题的答案。

class A:
    y = 1
    def foo(self):
        print B.x
class B:
    x = 1
    def bar(self):
        print A.y
>>> A().foo()
2
>>> B().bar()
1

在某些函数定义中使用'print'。

最新更新