Форум сайта python.su
В общем и среднем такой прикол:
имеем стуктуру (описываю
/django_project/forms.py
…
…
…
/django_project/apps/app1/forms.py
/django_project/forms.py
class CountersField(forms.fields.IntegerField):
def clean(self, value):
re_s= re.compile("\d*", re.U)
return super(CountersField, self).clean("".join(re.findall(re_s,value)))
/django_project/apps/app1/forms.py
from django_project.forms import CountersField
class SomeForm(forms.Form):
f1 = forms.ModelChoiceField()
f2 = forms.DateTimeField(initial = datetime.datetime(2008, 12,30))
input = CountersField()
output = CountersField()
#python manage.py shell
>>> from django import forms
>>> from django_project.apps.app1.forms import SomeForm
>>> f= SomeForm()
>>> f.input
<django_project.forms.CountersField object at 0x120c110>
>>> isinstance(f.input, forms.Field)
False
Отредактировано (Янв. 22, 2009 03:50:57)
Офлайн
lorienполя по именам аттрибутов существуют до запуска Form.__init__. Потом они загоняются в словарь. Отбираются по принадлежности к form.Field
Странно, у меня поля вообще не доступны при прямом обращении (form.foo), тока если (form) и класс у этих полей не forms.Field, а django.forms.forms.BoundField
Офлайн
denzЭто особенности системы импорта модулей.
Может найдутся у когонибудь идеи, оправдывающие такое поведение всеми любимого языка?
Офлайн
DaevaornТо есть дело не в MRO а в механизме импорта модулей? Ты что то знаешь, осталось только понять - откуда ты это знаешь :) Ткни ссылку плиз.denzЭто особенности системы импорта модулей.
Может найдутся у когонибудь идеи, оправдывающие такое поведение всеми любимого языка?
Вообще-то использовать имя пакета проекта при импорте априори плохая идея. Одну из причин вы и обнаружили.
Офлайн
lorienУ него поля не матчатся как forms.Field, соотвественно из __class__.__dict__ метаклассом не удаляются и доступны далее.
Так у тебя в коде же выполняется __init__. Я про это и написал, что странно, как ты получаешь доступ к этим полям.
denzЕсли учесть что MRO актуально при иерархии множественного наследования, то тут наследование простое и врядли вызывает сложности.
То есть дело не в MRO а в механизме импорта модулей? Ты что то знаешь, осталось только понять - откуда ты это знаешь smile Ткни ссылку плиз.
$ ls -R
.:
foo
./foo:
bar.py __init__.py
$ cat foo/bar.py
class Bar(object):
pass
$ cd foo
$ python
>>> import sys
>>>
>>> sys.path = [".."] + sys.path
>>>
>>> from bar import Bar
>>> from foo.bar import Bar as Bar1
>>>
>>> Bar == Bar1
False
>>>
>>> b = Bar()
>>> isinstance(b, Bar1)
False
Офлайн