Краткое примечание для тех, у кого может возникнуть желание написать window.ontouchstart !== undefined
->, пожалуйста, используйте micnic ответ, поскольку undefined
не является ключевым словом в JavaScript. Большая проблема, если разработка пишет что-то вроде:
undefined = window.ontouchstart;
Разработчик может сделать неопределенным все, что он хочет, и вы также можете проверить, если window.ontouchstart = myNonExistingWord;
Нет неуважения к тем, кто дал этот ответ: Я уверен, что я написал это и в моем коде;)
В 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
, если это проще.
Надеюсь, это поможет :)
Пока вы работая внутри метода, вы можете получить доступ к объекту класса.
Таким образом, в приведенном выше примере нет проблем, если creator.register (Y)
перемещается внутрь __ init __
. Однако у вас не может быть циклических ссылок на классы вне методов.
Ошибка заключается в том, что выполнение creator.register (Y)
предпринимается во время (исполняемого) определения класса X, и на этом этапе класс Y не определен. Поймите это: class
и def
- это операторы, которые выполняются (обычно во время импорта); это не «декларации».
Предложение: расскажите нам, чего вы пытаетесь достичь - возможно, в качестве нового вопроса.
ОБНОВЛЕНИЕ: Он изменил вопрос после моего ответа. В настоящее время принятое решение лучше в свете нового вопроса.
В чем проблема?
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()
Это компилируется и работает нормально.
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 плохо справлялся с перекрестными ссылками.