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、および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 スタイルですか? フォーラムの投稿をいくつか読みましたが、まだ混乱しています。

4

2 に答える 2

2

ゲッター メソッドとセッター メソッドは一般的に嫌われています。プロパティを使用してこれを実現できます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 に答える
2

property代わりに a を使用して分類を処理できます。

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代わりに呼び出される 2 番目のメソッドであるセッターで変換されます。

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 に答える