[英]Resolving how to give an attribute in a class in Python
我有以下课程:
class Point(object):
__slots__= ("x","y","z","data","classification")
def __init__(self,x,y,z,n=None):
self.x = float(x)
self.y = float(y)
self.z = float(z)
self.data = [self.x,self.y,self.z]
def set_classification(self,n):
self.classification = n
p = Point(10,20,30)
p.data
[10.0, 20.0, 30.0]
p.set_classification(0)
p.data
[10.0, 20.0, 30.0]
我有以下问题:
首先,创建Point对象的参数是x,y
和z
。 Classification
是一个辅助参数(有时在文件内报告,其他则不行)。 我希望找到一种方法,如果有可能,有p.data = [10.0, 20.0, 30.0, 50.0]
当类别设定或p.data = [10.0, 20.0, 30.0]
如果没有设置分类。
其次,我使用set_classification
def set_classification(self,n):
self.classification = n
这是正确的python API样式吗? 我读了几篇论坛帖子,但仍然感到困惑。
您可以使用property
来处理分类:
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]
这将为classification
属性设置吸气剂和吸气剂。 访问classification
属性将转换为第一个被调用的方法。 设置classification
属性将在第二种方法,即setter中转换:
p = Point(1, 2, 3)
p.classification = 50 # calls the second `classification` method, the setter, for you.
print p.classification # calls the first `classification` method, the getter.
我在这里选择了classification
属性作为属性,但是您也可以使data
成为属性。 您将哪个属性设为属性取决于使用模式和意图。 如果classification
很少更改,则使该属性更有效。
Getter和Setter方法通常不被接受。 您可以使用属性来实现此目的,但是建议您始终在返回值中包括classification
,因为脚本的其他部分可能希望data
始终为4项列表。 API应该保持一致。
这是我对使用属性的看法:
class Point(object):
__slots__= ("x", "y", "z", "data", "classification")
def __init__(self, x, y, z, n=None): ## what's n for?
self.x = float(x)
self.y = float(y)
self.z = float(z)
self.classification = None
@property
def data(self):
if self.classification:
return [self.x, self.y, self.z, self.classification]
else:
return [self.x, self.y, self.z]
p = Point(10, 20, 30)
print p.data ## [10.0, 20.0, 30.0]
p.classification = 50.0
print p.data ## [10.0, 20.0, 30.0, 50.0]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.