class A:
c = C()
class B:
a = A()
class C:
b = B()
Как нибудь можно заставить на питоне работать такое?
И как вообще такое решается?
class A:
c = C()
class B:
a = A()
class C:
b = B()
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.db.models.signals import post_save
from django.db.models.signals import post_delete
class AggregateCountField(models.PositiveIntegerField):
...
def __init__(self, agg_model, fk, *args, **kwargs):
self.agg_model = ContentType.objects.get(name = agg_model).model_class()
#далее идет поптыка привязатеь сигналы к модели Comment которая еще не определена
post_save.connect(self.recalc_count, sender=self.agg_model)
post_delete.connect(self.recalc_count, sender=self.agg_model)
# и поэтому сигналы не привязываются
...
class Text(models.Model):
comments_count = AggregateCountField('Comment','text')
class Comment(models.Model):
text = models.ForeignKey(Text)
class BlahBlah(...):
_stored_comments_count = None
def _get_comments_count(self):
if self._stored_comments_count is None:
self._stored_comments_count = AggregateCountField('Comment','text')
return self._stored_comments_count
comments_count = property(_get_comments_count)
class const(object):
"""
Constant property.
Always return value calculated first time.
Good for immputable types.
"""
class _Value(AddOn):
def __init__(self, obj, func):
self.value = func(obj)
def __init__(self, func):
self._func = func
self.__doc__ = func.__doc__
def __get__(self, instance, owner):
assert instance is not None
return self._Value(instance, self._func).value
class BlahBlah(...):
@const
def comments_count(self):
return AggregateCountField('Comment','text')
Андрей СветловКогда до описания класса Text доходит там определяется поле
Не совсем понятно, где именно видно, что ‘модель Comment еще не определена’
Андрей СветловВ простом случае с классами может такое и прошло бы но в джанго что-то не проходит - там на самом деле при объявлении каждой модели ( например class Text(models.Model)) вызывается еще какой то мета класс который там много чего колдует и ему описания полей нужны именно в таком формате (comments_count = AggregateCountField('Comment','text')) иначе он просто не воспримет это как описание поля.
Самый простой вариант: завернуть comments_count через property.
class A: pass
class B: pass
class C: pass
class A:
c = C()
class B:
a = A()
class C:
b = B()
pasaranaxэто я вчера тоже попробовал но опять же джанго не захавал, а для примера может и прокатит)
А как на счет стиля С++?class A: pass
class B: pass
class C: pass
class A:
c = C()
class B:
a = A()
class C:
b = B()