添加__slots__后@property不起作用



我怎样才能为下面的课程获得与@property一起工作的插槽。我有几千个导致内存问题的下类实例,所以我添加了插槽

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

添加插槽后,我的实例创建不起作用,并且出现以下错误

属性

错误:"主机"对象没有属性"_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)

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

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

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

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

请注意,您不需要__repr__中使用self.loc,只需将其设置为局部变量即可。您还尝试使用不存在的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)

__slots__的定义应具有基础属性的名称,这些属性将存储属性引用的数据。在下面的示例中,为不应在类外部访问的变量调用名称重整。该代码与您的代码相似,根据 PEP8 在线网站没有错误。

#! /usr/bin/env python3
def main():
    print(Host('Hello, world!', 'Earth'))
    print(Host('Hello, Xyz!'))

class Host:
    __slots__ = '__name', '__location'
    def __init__(self, name, location=''):
        self.name = name
        self.location = location
    def __repr__(self):
        return '{!s}({!r}, {!r})'.format(
            type(self).__name__,
            self.name,
            self.location
        )
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self, value):
        self.__name = value
    @property
    def location(self):
        return self.__location
    @location.setter
    def location(self, value):
        self.__location = value.casefold() if value else 'Not Found'

if __name__ == '__main__':
    main()

相关内容

最新更新