Форум сайта python.su
Бывает сталкиваюсь с подобными проблемами:
class A:
c = C()
class B:
a = A()
class C:
b = B()
Офлайн
А можно практический пример?
А то я, например, никогда с такими потребностями не сталкивался, тут, по-моему, попахивает идеологической ошибкой.
Офлайн
Пример будет тогда из джанги) изобретаю такой вот велосипед под названием AggregateField.
в кратце это денормализованное поле которое автоматически следит за количеством связанных объектов в отношении 1:М.
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)
Отредактировано (Сен. 26, 2009 02:40:38)
Офлайн
Решается, конечно.
Не совсем понятно, где именно видно, что ‘модель Comment еще не определена’
Простите, я не спец по Джанге - так, поглядывал искоса…
Дальше идет отсебятина по решению “в лоб”.
Самый простой вариант: завернуть comments_count через property.
Будет вызываться при каждом обращении.
Чтобы такого не было, пишем
Делай раз:
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.
Отредактировано (Сен. 26, 2009 06:11:51)
Офлайн
А как на счет стиля С++?
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()
Офлайн