2

我有以下课程:

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, 和zClassification是一个附件参数(有时是文件内的报告其他没有)。如果可能的话,我希望找到一种方法来 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 风格吗?我阅读了几个论坛帖子,但我仍然感到困惑。

4

2 回答 2

2

您可以使用 aproperty来处理分类:

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这为属性设置了一个 getter 和一个 setter ;访问该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很少更改,则使其成为属性会更有效。

于 2013-02-28T13:33:54.000 回答
2

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]
于 2013-02-28T13:36:23.910 回答