我希望能够在具有插槽优化的类中使用python描述符:

class C(object):
    __slots__ = ['a']
    a = MyDescriptor('a')
    def __init__(self, val):
        self.a = val

我的问题是如何实现描述符类,以便能够在调用描述符对象的类实例中存储值。通常的解决方案看起来像下面的解决方案,但是由于在C类中调用“插槽”时不再定义“dict”,因此无法使用:
class MyDescriptor(object):
    __slots__ = ['name']
    def __init__(self, name_):
        self.name = name_
    def __get__(self, instance, owner):
        if self.name not in instance.__dict__:
            raise AttributeError, self.name
        return instance.__dict__[self.name]
    def __set__(self, instance, value):
        instance.__dict__[self.name] = value

最佳答案

不要声明与插槽和实例方法相同的名称。使用其他名称,而不是通过__dict__将槽作为属性访问。

class MyDescriptor(object):
    __slots__ = ['name']
    def __init__(self, name_):
        self.name = name_
    def __get__(self, instance, owner):
        return getattr(instance, self.name)
    def __set__(self, instance, value):
        setattr(instance, self.name, value)

class C(object):
    __slots__ = ['_a']
    a = MyDescriptor('_a')
    def __init__(self, val):
        self.a = val

foo = C(1)
print foo.a
foo.a = 2
print foo.a

关于python - 在插槽中使用Python描述符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4912499/

10-14 18:02