C++最棒的一件事就是使用了const-reference参数--使用这种类型的参数,你可以很好地保证对象不会被意外修改,也不会有副作用。
问题是,什么样的Python等同于这样的参数?
例如,假设您有以下C++方法:
void Foo::setPosition(const QPoint &position) {
m_position = position;
}你想把它“翻译”成Python,如下所示:
def set_position(self, position):
self.position = position这样做可能会产生很多麻烦,而且还可能出现许多细微的bug。问题是,使用常量引用参数(复制构造函数)的C++方法的“Python等价”方式是什么?
上次我捕获了一个bug,因为我有一个糟糕的“C++ -> Python翻译”;我修复了这个错误,比如:
my_python_instance.set_position(QPoint(pos))…换句话说,我的另一个选择是从调用者…克隆对象我很确定这不是正确的方法。
发布于 2016-09-21 10:41:07
我希望我没弄错。
简而言之,没有一个。在python中,有两件事你是不会经常遇到的。const构造函数和复制构造函数。
这是一个设计决定,python是一种不同的语言。参数总是通过引用传递的。
const正确性
这是由用户决定的,不能搞乱对象,我认为这并不经常发生。就我个人而言,我喜欢c++中的常量正确性,但我从未发现自己在python中遗漏了它。它是一种动态的脚本语言,所以看微优化是没有意义的,微优化可以在参数常量断言下完成。
复制对象
..。在python中不会做太多的事情。在我看来,将内存管理转移到用户身上是一个设计决定,因为很难有一个好的标准方式,例如浅拷贝和深拷贝。我猜如果你假设你不太需要它,那么为每个对象提供一种方法(就像c++一样)是没有意义的,而只是为那些确实需要它的对象提供方法。
因此,没有统一的pythonic方式。在标准中至少有几种方法可以做到这一点:
模块列表copied = original[:].
dict.
dict和list做到了这一点,所以你可以编写copied = list(original).
copy,为此你可以提供自定义的方法__copy__和__deepcopy__。它还有一个优点,那就是使用另一个标准库--用于serialization.的pickle
最类似c++的方式是选项3。-实现一个构造函数,以便它接受返回其参数副本的调用(当参数是相同类型时)。但它可能需要一些巧妙的ctor实现,因为您不能进行类型重载。
选项2.是相同的,但被重构为一个函数。
因此,最好的方法可能是提供显式的__copy__/copy方法,如果您愿意的话,还可以支持ctor调用来调用它。
然后,作为object的开发人员,您可以确保常量正确性,并为用户提供一种简单而明确的方式来请求副本。
发布于 2016-09-21 10:22:39
没有直接对等的东西。最接近的方法是使用copy module并在您的类上定义__copy__()和/或__deepcopy__()方法。
发布于 2016-09-21 11:06:06
在函数上编写一个装饰器。让它在传入时序列化数据,在传出时序列化数据,并确认两者相等。如果不是,则生成一个错误。
Python类型检查主要是运行时检查,即参数满足某些谓词。C++中的const是对函数行为的类型检查:因此,您必须对函数的行为进行运行时检查才是等价的。
您也可以仅在进行单元测试或调试构建时进行此类检查,“证明”它是正确的,然后在“发布”模式下删除检查。
或者,您可以编写一个静态分析器,使用inspect模块检查const违规,并修饰您缺少源代码的参数的不变性。也许编写自己的支持const的语言变体也同样容易。几乎是不可能的。
https://stackoverflow.com/questions/39606315
复制相似问题