C++ 的一大优点是使用 const
引用参数 - 使用这些类型的参数,几乎可以保证对象不会被意外修改,并且不会出现“没有副作用。
问题是,与此类参数等效的 Python 是什么?
例如,假设您有以下 C++ 方法:
void Foo::setPosition(const QPoint &position) {
m_position = position;
}
并且您想将其“翻译”为 Python,如下所示:
def set_position(self, position):
self.position = position
这样做可能会产生很多麻烦,并且也可能出现许多微妙的错误。问题是,使用 const 引用参数(复制构造函数)的 C++ 方法的“Python 等效”方式是什么?
上次我发现了一个错误,因为我的“C++ -> Python 翻译”很糟糕;我用类似的方法修复了这个问题:
my_python_instance.set_position(QPoint(pos))
...否则,我的另一个选择是从调用者那里克隆对象...我非常确定这不是正确的方法。
最佳答案
希望我理解正确。
很快就没有了。有两件事是你在 python 中不经常遇到的。 const
和复制构造函数。
这是一个设计决定,Python 是一种不同的语言。参数始终通过引用传递。
const
正确性
用户不要弄乱对象是由用户决定的,我认为这种情况不会经常发生。就我个人而言,我喜欢 c++ 中的 const 正确性,但我从未发现自己在 python 中错过了它。它是一种动态的脚本语言,因此没有必要考虑可以在参数常量断言下完成的微观优化。
复制对象
...在 python 中你不会做太多。在我看来,将内存管理卸载给用户是一个设计决策,因为很难通过良好的标准方法来实现,例如浅拷贝与深拷贝。我想如果你认为你不太需要它,那么为每个对象提供一种方法(就像 c++ 那样)是没有意义的,而只是为那些确实需要它的对象提供一种方法。
因此,没有统一的Pythonic方式。标准中至少有几种方法可以做到这一点:
- 列表
复制=原始[:]
。 - 某些对象提供
copy
方法,例如dict
。 - 某些对象显式提供构造函数(例如在 C++ 中),
dict
和list
就是这样做的,因此您可以编写copied = list(original)
. - 有一个模块
copy
,您可以为其提供自定义方法__copy__
和__deepcopy__
。它的另一个优点是另一个标准库可以与它一起使用 - 用于序列化的pickle
。
最像 C++ 的方法是选项 3. - 实现构造函数,以便它接受返回其参数拷贝的调用(当参数具有相同类型时)。但它可能需要一些巧妙的 ctor 实现,因为你无法进行类型重载。
选项 2. 相同,但重构为函数。
因此,最好的方法可能是提供显式的 __copy__
/copy
方法,如果您愿意的话,可以支持构造器调用来调用它。
然后,作为对象的开发人员,您可以确保 const 正确性,并为用户提供一种简单的显式方法来请求拷贝。
关于python - python 中 C++ const-reference 复制构造函数参数的等价物是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39606315/