Python — добавление атрибута в дескриптор

У меня есть этот дескриптор:

# Generic descriptor
class Attribute(object):
    def __init__(self, value):
        self.value = value
    def __get__(self, instance, value):
        return self.value
    def __set__(self, instance, value):
        self.value = value

Я бы добавил атрибут «модифицированный», чтобы проверить, изменен ли экземпляр дескриптора. Эс.

# Generic descriptor
class Attribute(object):
    def __init__(self, value):
        self.value = value
        self.modified = False
    def __get__(self, instance, value):
        return self.value
    def __set__(self, instance, value):
        self.value = value
        self.modified = True

Как я могу это сделать?


person Dario Turini    schedule 26.09.2013    source источник


Ответы (1)


Обратите внимание, что в ваших методах __get__ и __set__ вы на самом деле хотите получить доступ к instance, а не к self (self является фактическим объектом Attribute).

Вот один из способов сделать это:

class Attribute(object):
    def __init__(self, attr):
        self.attr = attr
    def __get__(self, instance, owner):
        return getattr(instance, self.attr)
    def __set__(self, instance, value):
        setattr(instance, self.attr, value)
        instance.modified = True

class A(object):
    def __init__(self):
        self._f = 0
        self.modified = False
    f = Attribute('_f')

a = A()
a.f
=> 0
a.modified
=> False
a.f = 33
a.modified
=> True

Конечно, этот фрагмент можно улучшить разными способами, в зависимости от того, чего вы пытаетесь достичь.

person shx2    schedule 26.09.2013