2

以前は C++ で定数インターフェイスを使用してクラスを作成していましたが、アドバイスを求めたいのですが、Python プログラムでそれを実行する必要がありますか?

クラス Point の不変オブジェクトが必要であると仮定します。C++ コードは次のとおりです。

class Point
{
public:
    Point(double x, double y) :
        x_{x},
        y_{y}
    { }

    double x() const { return x_; }
    double y() const { return x_; }

private:
    double x_;
    double y_;
};

Point 型のオブジェクトを使用すると、それらが決して変更されないことがわかっています (それを行うためのいくつかのハックがあると思いますが、今は問題ではありません)。

Pythonにはいくつかの方法があります。

あなたは妄想的です!短くシンプルにしてください!

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])

[+]非常に明確なコード

[-]問題が解決しない

クラス属性の getter のみを記述するようにしてください。

class Point:
    def __init__(self, x, y):
        self._x = x
        self._y = y

    def x(self):
        return self._x

    def y(self):
        return self._y

[+]先頭のアンダースコアは、属性が「プライベート」であることを示しています

[?]「C++ライクなコードの模倣」を書くのは得策ではないと思います。言語が違うだけだから。

[-]属性は引き続き簡単にアクセスできます。アンダースコアを 2 つ付けて名前を付ける必要がありますか? (__x と __y)

もう 1 つの方法は、このトピックで見つけたデコレータを作成することです: Python で定数を作成する方法

def constant(f):
    def fset(self, value):
        raise SyntaxError
    def fget(self):
        return f()
    return property(fget, fset)

class Point:
    ...
    @constant
    def x(self)
        return self.__x

[+]問題を完全に解決します (はい、まだ x と y の値を変更できますが、難しくなります)

[?]それはまったく Python のやり方ですか?

[-]コードが多すぎる

だから、私の質問は、ベストプラクティスは何ですか?

4

2 に答える 2