Порядок классов имеет значение при использовании переменных друг от друга - PullRequest
0 голосов
/ 13 марта 2019

Я новичок в 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 ]

2 голосов
/ 13 марта 2019

Вы выполняете print как часть определения класса.Он выполняется, как только python видит эту строку кода, прежде чем прочитать часть о class b.

Вместо этого используйте функции внутри классов для выполнения кода после определения классов:

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

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

a.go()
b.go()
1 голос
/ 13 марта 2019

Как я уже сказал в комментарии, ваш код не использует классы эффективно. Вот то, что я думаю, было бы лучшим подходом, который предлагает большую гибкость в работе над циклической справочной проблемой.

Сначала определения 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() в качестве декоратора для создания "дескрипторы" . Вот ответ на несколько связанный вопрос, иллюстрирующий его использование.

0 голосов
/ 13 марта 2019
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

В некоторых определениях функций использовать «печать».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...