我怎样才能为下面的课程获得与@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()