1

@property(長所と短所)の使用については明確ではありません。Martijnの助けを借りて構築されたこのクラスを使用して、いくつかの例を求めたいと思います。

データ (テキスト形式) には、点 (テキスト ファイルの 1、2、および 3 列) を特徴付けるxy、およびが常に含まれます。z" 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]

を使用する哲学を理解するために、locationwhenが既に設定されている場合を追加したいと思います。次のコードを試してみましたが、これがpythonicかどうかわかりません:classification@property

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]
4

1 に答える 1

3

したがって、クラスは機能し、それが Pythonic であるかどうかを尋ねているだけです。私は専門家ではありませんが、Zen of Pythonを紹介します。

明示的は暗黙的よりも優れています。

私にとっては、1 つのプロパティ (場所、分類) を設定すると、他の属性が黙って変更されることになります。これは暗黙的であり、明示的ではありません。assign_locationand/orassign_classificationメソッドのようなものを使用すると、より適切でより明確に理解できるユースケースになると思います。そうすれば、API を使用している人は、属性を設定しているだけでなく、その機能を説明する docstring を持つ関数を呼び出していることを知ることができます。

プロパティの哲学が何であるかについては、その包含が哲学に基づいていたかどうかはわかりません。プロパティ デコレーターが行ったことは、次のような見苦しいものを取り除くことでした。

class Foo:
    def __getattr__(self, attr):
        if attr == 'location':
            ...
        elif attr == 'classification':
            ...

私が非常に気に入っている用途の 1 つは、プロパティを使用して物事をスレッド セーフにすることです。例えば:

class Foo(object):
    def __init__(self):
        self.lock = threading.Lock()
    @property
    def classification(self):
        return self.classification

    @classification.setter
    def classification(self, value):
        with self.lock:
            (something else thread-protected)
            self.classification = value

最後にもう一つアドバイス。スロットを使用している理由がわからない場合は、使用しないでください。スロットが必要な理由がわからない限り、それらは必要ありません。

于 2013-02-28T17:29:31.280 に答える