我曾经用 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
[+]前导下划线表示属性是“private”
[?]我认为编写“模仿类 C++ 的代码”不是一个好主意。只是因为它是一种不同的语言。
[-]属性仍然很容易访问。我应该用双下划线命名它们吗?(__x 和 __y)
另一种方法是编写我在本主题中找到的装饰器:如何在 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 方式吗?
[-]代码太多
所以,我的问题是,最佳实践是什么?