繁体   English   中英

解决如何在Python中的类中赋予属性

[英]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,yz 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM