python - python 中 C++ const-reference 复制构造函数参数的等价物是什么

标签 python c++ language-lawyer copy-constructor const-correctness

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方式。标准中至少有几种方法可以做到这一点:

  1. 列表复制=原始[:]
  2. 某些对象提供copy方法,例如dict
  3. 某些对象显式提供构造函数(例如在 C++ 中),dictlist 就是这样做的,因此您可以编写 copied = list(original).
  4. 有一个模块copy ,您可以为其提供自定义方法 __copy____deepcopy__。它的另一个优点是另一个标准库可以与它一起使用 - 用于序列化的 pickle

最像 C++ 的方法是选项 3. - 实现构造函数,以便它接受返回其参数拷贝的调用(当参数具有相同类型时)。但它可能需要一些巧妙的 ctor 实现,因为你无法进行类型重载。

选项 2. 相同,但重构为函数。

因此,最好的方法可能是提供显式的 __copy__/copy 方法,如果您愿意的话,可以支持构造器调用来调用它。

然后,作为对象的开发人员,您可以确保 const 正确性,并为用户提供一种简单的显式方法来请求拷贝。

关于python - python 中 C++ const-reference 复制构造函数参数的等价物是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39606315/

相关文章:

python - 模块 'selenium.webdriver' 没有属性 'get'

c++ - 如何在基类中使用接口(interface)?

html - 为什么我的 block 与行的底部对齐? (CSS/HTML)

python - WSGI - 将内容类型设置为 JSON

python - 在 Xcode 中运行 iOS 项目之前运行 python HttpServer

c++ - C++中对象状态的重构

c++ - 抽象类/不同类型类的集合?

c++ - 为什么我不能在模板类中内联定义非模板 friend ?

c++ - 如何通过聚合访问对象的存储

python - 使用 re 转换列表 get 元素的最 Pythonic 方法