添加 __slots__ 后 @property 不起作用

zsh*_*zsh 4 python properties slots

我怎样才能让插槽与@property一起用于下面的课程。我有数千个下面的类的实例,这导致了内存问题,所以我添加了插槽

我使用数据创建了实例,然后将位置信息添加到实例中。

添加插槽后,我的实例创建无法正常工作,并且收到以下错误

AttributeError:“主机”对象没有属性“_location”

class Host(object):
    __slots__ = ['data', 'location']

    def __init__(self, data, location=''):
        self.data = data
        self.location = location

    @property
    def location(self):
        return self._location

    @location.setter
    def location(self, value):
        self._location = value.lower()

    def __repr__(self):
        if self.location == '':
            self.loc = 'Not Found'
        else:
            self.loc = self.location
        return 'Host(name={}, location={})'.format(self.name, self.loc)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

__slots__通过在类上创建可以直接访问实例的内存数据结构的描述符来工作。您正在locationproperty对象屏蔽描述符,并且定义了一个不在槽中的属性。_location

创建_location插槽(因为这是您实际存储的属性):

class Host(object):
    __slots__ = ['data', '_location']
Run Code Online (Sandbox Code Playgroud)

然后,该location属性(也是描述符对象)可以正确分配给self._location由槽描述符支持的属性。

请注意,您不需要self.loc中使用__repr__,只需将其设为局部变量即可。您还尝试使用self.name不存在的属性;但尚不清楚该值应该是什么:

def __repr__(self):
    loc = self.location or 'Not Found'
    name = self.data['name']  # or some other expression
    return 'Host(name={}, location={})'.format(name, loc)
Run Code Online (Sandbox Code Playgroud)