解析如何在Python中的类中给予属性

2wnc66cl  于 2023-11-16  发布在  Python
关注(0)|答案(2)|浏览(97)

我有以下类:

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,yzClassification是一个辅助参数(有时在文件中报告其他否)。我希望找到一种方法,如果可能的话,在设置分类时使用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

d4so4syb

d4so4syb1#

您可以使用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属性设置一个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很少更改,将其作为属性会更有效。

ie3xauqp

ie3xauqp2#

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]

字符串

相关问题