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)
__slots__通过在类上创建可以直接访问实例的内存数据结构的描述符来工作。您正在location用property对象屏蔽描述符,并且定义了一个不在槽中的新属性。_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)
| 归档时间: |
|
| 查看次数: |
3073 次 |
| 最近记录: |