首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是c++常量引用复制构造函数参数的python等效项

什么是c++常量引用复制构造函数参数的python等效项
EN

Stack Overflow用户
提问于 2016-09-21 09:53:19
回答 4查看 2.2K关注 0票数 2

C++最棒的一件事就是使用了const-reference参数--使用这种类型的参数,你可以很好地保证对象不会被意外修改,也不会有副作用。

问题是,什么样的Python等同于这样的参数?

例如,假设您有以下C++方法:

代码语言:javascript
复制
void Foo::setPosition(const QPoint &position) {
    m_position = position;
}

你想把它“翻译”成Python,如下所示:

代码语言:javascript
复制
def set_position(self, position):
    self.position = position

这样做可能会产生很多麻烦,而且还可能出现许多细微的bug。问题是,使用常量引用参数(复制构造函数)的C++方法的“Python等价”方式是什么?

上次我捕获了一个bug,因为我有一个糟糕的“C++ -> Python翻译”;我修复了这个错误,比如:

代码语言:javascript
复制
my_python_instance.set_position(QPoint(pos))

…换句话说,我的另一个选择是从调用者…克隆对象我很确定这不是正确的方法。

EN

回答 4

Stack Overflow用户

发布于 2016-09-21 10:41:07

我希望我没弄错。

简而言之,没有一个。在python中,有两件事你是不会经常遇到的。const构造函数和复制构造函数。

这是一个设计决定,python是一种不同的语言。参数总是通过引用传递的。

const正确性

这是由用户决定的,不能搞乱对象,我认为这并不经常发生。就我个人而言,我喜欢c++中的常量正确性,但我从未发现自己在python中遗漏了它。它是一种动态的脚本语言,所以看微优化是没有意义的,微优化可以在参数常量断言下完成。

复制对象

..。在python中不会做太多的事情。在我看来,将内存管理转移到用户身上是一个设计决定,因为很难有一个好的标准方式,例如浅拷贝和深拷贝。我猜如果你假设你不太需要它,那么为每个对象提供一种方法(就像c++一样)是没有意义的,而只是为那些确实需要它的对象提供方法。

因此,没有统一的pythonic方式。在标准中至少有几种方法可以做到这一点:

模块列表copied = original[:].

  • Some对象提供了模块方法,像dict.

  • Some对象显式地提供了一个构造函数(就像在c++中一样),dictlist做到了这一点,所以你可以编写copied = list(original).

  • There is a
  1. copy,为此你可以提供自定义的方法__copy____deepcopy__。它还有一个优点,那就是使用另一个标准库--用于serialization.

pickle

最类似c++的方式是选项3。-实现一个构造函数,以便它接受返回其参数副本的调用(当参数是相同类型时)。但它可能需要一些巧妙的ctor实现,因为您不能进行类型重载。

选项2.是相同的,但被重构为一个函数。

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

然后,作为object的开发人员,您可以确保常量正确性,并为用户提供一种简单而明确的方式来请求副本。

票数 3
EN

Stack Overflow用户

发布于 2016-09-21 10:22:39

没有直接对等的东西。最接近的方法是使用copy module并在您的类上定义__copy__()和/或__deepcopy__()方法。

票数 1
EN

Stack Overflow用户

发布于 2016-09-21 11:06:06

在函数上编写一个装饰器。让它在传入时序列化数据,在传出时序列化数据,并确认两者相等。如果不是,则生成一个错误。

Python类型检查主要是运行时检查,即参数满足某些谓词。C++中的const是对函数行为的类型检查:因此,您必须对函数的行为进行运行时检查才是等价的。

您也可以仅在进行单元测试或调试构建时进行此类检查,“证明”它是正确的,然后在“发布”模式下删除检查。

或者,您可以编写一个静态分析器,使用inspect模块检查const违规,并修饰您缺少源代码的参数的不变性。也许编写自己的支持const的语言变体也同样容易。几乎是不可能的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39606315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档