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

时间:2019-03-13 18:01:19

标签: python class variables

我是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

3 个答案:

答案 0 :(得分:2)

您正在执行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()

答案 1 :(得分:1)

正如我在评论中所说,您的代码没有有效利用类。我认为这是一种更好的方法,可以为解决循环参考问题提供更大的灵活性。

首先是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. * OR *,方法是创建第一个不具有链接值的对象,而仅保留第二个需要手动链接的对象。

    # 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()函数作为修饰符来创建"descriptors"来应用于这种情况。 an answer是一个与之相关的问题,说明了其用法。

答案 2 :(得分:0)

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

在某些函数定义中使用“打印”。