我是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
答案 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)
类似的定义提供了两种建立循环引用的方式:
通过分别创建它们,然后显式链接它们:
# 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
* 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
在某些函数定义中使用“打印”。