Использование __setattr__ и дескрипторов для класса python

Я пишу класс python, который использует __ setattr __ и __ getattr __ для обеспечения доступа к настраиваемым атрибутам.

Однако некоторые атрибуты нельзя обрабатывать обычным образом, поэтому я надеялся использовать для них дескрипторы.

Проблема возникает в том, что для дескриптора дескриптор __ get __ будет вызываться в пользу экземпляров __ getattr __ , но при назначении атрибуту __ setattr __ будет вызываться в пользу дескрипторов __ set __ .

Пример:

class MyDesc(object):

    def __init__(self):
        self.val = None

    def __get__(self, instance, owner):
        print "MyDesc.__get__"
        return self.val

    def __set__(self, instance, value):
        print "MyDesc.__set__"
        self.val = value

class MyObj(object):

    foo = MyDesc()

    def __init__(self, bar):
        object.__setattr__(self, 'names', dict(
            bar=bar,
        ))
        object.__setattr__(self, 'new_names', dict())

    def __setattr__(self, name, value):
        print "MyObj.__setattr__ for %s" % name
        self.new_names[name] = value

    def __getattr__(self, name):
        print "MyObj.__getattr__ for %s" % name

        if name in self.new_names:
            return self.new_names[name]

        if name in self.names:
            return self.names[name]

        raise AttributeError(name)

if __name__ == "__main__":
    o = MyObj('bar-init')

    o.bar = 'baz'
    print o.bar

    o.foo = 'quux'
    print o.foo

выводит:

MyObj.__setattr__ for bar
MyObj.__getattr__ for bar
baz
MyObj.__setattr__ for foo
MyDesc.__get__
None

Дескриптор __ set __ никогда не вызывается.

Поскольку определение __ setattr __ - это не просто переопределяющее поведение для ограниченного набора имен, нет четкого места, которое оно могло бы передать объекту .__ setattr __

Есть ли рекомендуемый способ если для присвоения атрибутов используется дескриптор, если он доступен, и __ setattr __ в противном случае?

7
задан SpoonMeiser 6 February 2012 в 14:06
поделиться