以前は 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 のやり方ですか?
[-]コードが多すぎる
だから、私の質問は、ベストプラクティスは何ですか?