В python код в классе запускается при загрузке класса.
Теперь, что, черт возьми, это значит? ; -)
Рассмотрим следующий код:
class x:
print "hello"
def __init__(self): print "hello again"
Когда вы загружаете модуль, содержащий код, python напечатает hello
. Всякий раз, когда вы создаете x
, python будет печатать hello again
.
Вы можете думать о def __init__(self): ...
как эквивалентном с __init__ = lambda self: ...
, за исключением того, что ни одно из ограничений Python лямбда не применяется. То есть def
- это присваивание, которое может объяснить, почему выполняется код вне методов, но не внутри методов.
Когда в вашем коде написано
class X(models.Model):
creator = Registry()
creator.register(Y)
Вы ссылаетесь на Y
при загрузке модуля, прежде чем Y
будет иметь значение. Вы можете думать о class X
как о назначении (но я не могу вспомнить синтаксис для создания анонимных классов из рук в руки; возможно, это вызов type
?)
Что вы можете сделать, это:
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
, если это проще.
Надеюсь, это поможет:)