我不清楚使用@property
(优点和缺点)。我想问一些使用在Martijn帮助下构建的类的示例。
数据(文本格式)始终具有x
、y
和z
来表征一个点(文本文件的 1、2 和 3 列)。有时我有一个“ classification
”(第 4 列)属性和/或 location
(第 5 列)。取决于文件的处理方式(有时更多属性)。
class Point(object):
__slots__= ("x", "y", "z", "data", "_classification")
def __init__(self, x, y, z):
self.x = float(x)
self.y = float(y)
self.z = float(z)
self.data = [self.x,self.y,self.z]
@property
def classification(self):
return getattr(self, '_classification', None)
@classification.setter
def classification(self, value):
self._classification = value
if value:
self.data = self.data[:3] + [value]
else:
self.data = self.data[:3]
def __len__(self):
return len(self.data)
p = Point(10,20,30)
len(p)
3
p.classification = 1
len(p)
4
p.data
[10.0, 20.0, 30.0, 1]
我希望添加location
whenclassification
已经设置,以了解使用@property
. 我尝试使用以下代码,但我不知道这是否是 pythonic:
class Point(object):
__slots__= ("x", "y", "z", "data", "_classification",'_location')
def __init__(self, x, y, z):
self.x = float(x)
self.y = float(y)
self.z = float(z)
self.data = [self.x,self.y,self.z]
@property
def classification(self):
return getattr(self, '_classification', None)
@classification.setter
def classification(self, value):
self._classification = value
if value:
self.data = self.data[:3] + [value]
else:
self.data = self.data[:3]
@property
def location(self):
return getattr(self, '_location', None)
@location.setter
def location(self, value):
self._location = value
if value:
self.data = self.data[:4] + [value]
else:
self.data = self.data[:4]
def __len__(self):
return len(self.data)
p = Point(10,20,30)
p.classification = 1
p.data
[10.0, 20.0, 30.0, 1]
p.location = 100
p.data
[10.0, 20.0, 30.0, 1, 100]
p = Point(10,20,30)
p.location = 100
p.data
[10.0, 20.0, 30.0, 100]