我希望能够在具有插槽优化的类中使用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/