LINUX.ORG.RU

Задачка про наследование

 


0

1

Вот встретилась такая задачка:

> class Foo(Model):
>>>     number = IntField()
>>>
>>> f = Foo()
>>> f.number = 42
>>> print f.number
>>> 42
>>> f.number = "nan"
>>> Traceback (most recent call last): TypeError

Нужно написать class Model + IntField ( это custom тип ?). У меня в голову кроме переопределения __setattr__ ничего не приходит.



Последнее исправление: Jopich (всего исправлений: 3)

Сделать то что хотел? Может mixin тебе поможет?

dtm
()

См сорсы джанга моделей, емнип можно сделать без метаклассов если не важен порядок филдов.

zz ★★★★
()

Я бы сделал через __setattr__, хотя в этой задаче явно намекают на __set__ .

true_admin ★★★★★
()

Я бы через дескрипторы делал.

Kilte ★★★★★
()
Ответ на: комментарий от holuiitipun

Те что то типа такого:

class IntField(object):
    value = None
    def __get__(self, instance, owner):
        return self.value

    def __set__(self, instance, value):
        self.value = int(value)

class Model(object):
    pass

class Foo(Model):
    r = IntField()

rr = Foo()
rr.r = "saas"
print rr.r
?

Jopich
() автор топика
Ответ на: комментарий от Jopich

Вернее как-то так:

class IntField(object):
    def __init__(self, default=None):
        self._default = default
        self._values = {}

    def __get__(self, instance, owner):
        return self._values.get(instance, self._default)

    def __set__(self, instance, value):
        self._values[instance] = int(value)


class Model(object):
    pass


class Foo(Model):
    r = IntField()


rr = Foo()
rr.r = 123
print(rr.r)
rr.r = "test"

holuiitipun
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.