классы Python, которые относятся друг к другу

Краткое примечание для тех, у кого может возникнуть желание написать window.ontouchstart !== undefined ->, пожалуйста, используйте micnic ответ, поскольку undefined не является ключевым словом в JavaScript. Большая проблема, если разработка пишет что-то вроде:

undefined = window.ontouchstart;

Разработчик может сделать неопределенным все, что он хочет, и вы также можете проверить, если window.ontouchstart = myNonExistingWord;

Нет неуважения к тем, кто дал этот ответ: Я уверен, что я написал это и в моем коде;)

8
задан Wayne Koorts 25 June 2009 в 21:23
поделиться

5 ответов

В python код в классе запускается, когда класс загружается.

Что, черт возьми, это означает? ; -)

Рассмотрим следующий код:

class x:
    print "hello"
    def __init__(self): print "hello again"

Когда вы загружаете модуль, содержащий код, python напечатает hello . Всякий раз, когда вы создаете x , python снова напечатает hello .

Вы можете подумать о def __init __ (self): ... эквивалентно __ init__ = lambda self: ... , за исключением того, что не применяются никакие ограничения лямбда-выражения Python. То есть def - это присвоение, которое может объяснить, почему выполняется код вне методов, но не внутри методов.

Когда ваш код говорит

class X(models.Model):
    creator = Registry()
    creator.register(Y)

, вы ссылаетесь на Y , когда модуль загружен до того, как Y получит значение. Вы можете думать о классе X как о назначении (но я не могу вспомнить синтаксис для создания анонимных классов; может быть, это вызов типа ?)

Что вы можете сделать следующее:

class X(models.Model):
    pass
class Y(models.Model):
    foo = something_that_uses_(X)
X.bar = something_which_uses(Y)

То есть создать атрибуты класса X , которые ссылаются на Y после создания Y . Или наоборот: сначала создайте Y , затем X , затем атрибуты Y , которые зависят от X , если это проще.

Надеюсь, это поможет :)

создать атрибуты класса X , которые ссылаются на Y после создания Y . Или наоборот: сначала создайте Y , затем X , затем атрибуты Y , которые зависят от X , если это проще.

Надеюсь, это поможет :)

создать атрибуты класса X , которые ссылаются на Y после создания Y . Или наоборот: сначала создайте Y , затем X , затем атрибуты Y , которые зависят от X , если это проще.

Надеюсь, это поможет :)

17
ответ дан 5 December 2019 в 08:25
поделиться

Пока вы работая внутри метода, вы можете получить доступ к объекту класса.

Таким образом, в приведенном выше примере нет проблем, если creator.register (Y) перемещается внутрь __ init __ . Однако у вас не может быть циклических ссылок на классы вне методов.

2
ответ дан 5 December 2019 в 08:25
поделиться

Ошибка заключается в том, что выполнение creator.register (Y) предпринимается во время (исполняемого) определения класса X, и на этом этапе класс Y не определен. Поймите это: class и def - это операторы, которые выполняются (обычно во время импорта); это не «декларации».

Предложение: расскажите нам, чего вы пытаетесь достичь - возможно, в качестве нового вопроса.

2
ответ дан 5 December 2019 в 08:25
поделиться

ОБНОВЛЕНИЕ: Он изменил вопрос после моего ответа. В настоящее время принятое решение лучше в свете нового вопроса.

В чем проблема?

class A(object):
    def __init__(self):
        super(A, self).__init__()


    def b(self):
        return B()


class B(object):
    def __init__(self):
        super(B, self).__init__()


    def a(self):
        return A()

Это компилируется и работает нормально.

2
ответ дан 5 December 2019 в 08:25
поделиться

The problem is most likely not Python. I would think it is an SQL issue. The classes are via an abstraction layer converted to an SQL query to create a table. Вы пытаетесь ссылаться из одной таблицы на другую, которая в то время еще не существует.

В SQL вы могли бы решить эту проблему, создав сначала таблицу без ссылок, а затем изменив их, чтобы сделать эти ссылки,

Однако Я не уверен в своем ответе, поэтому примите его с большим количеством приправ, я был бы весьма удивлен, если бы уровень абстракции базы данных Django плохо справлялся с перекрестными ссылками.

-3
ответ дан 5 December 2019 в 08:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: