2015-08-28 72 views
2

假设我们有一个对象a,我们要修改的数据是这样的Python化的方式,以避免指针

a.substructure1.subsubstructure1.name_of_the_data1

a.substructure2.subsubstructure2.name_of_the_data2

结构要访问这个结构我们称之为一个外部方法get_the_data_shortcut(a),它被大量参数化(例如参数subsstructure指定要返回哪个子结构)。这看起来非常冗余,但对于所有这些参数都有一个非常好的默认设置,这是合理的。此外,如果默认分支不可用,此函数将返回另一个数据分支。

如何修改get_the_data_shortcut(a)

b = get_the_data_shortcut(a) 
b = b + 1 

然后,get_the_data_shortcut(a)不变,因为还有Python是不是Java。

我需要一个setter吗?大多数情况下,这不是我的代码,并且是由编写pythonic代码的人编写的,我试图跟上这些标准。

+4

通常Python的办法是做类似'B = A .substructure1.subsubstructure1; b.name_of_the_data1 + = 1'。但是,也许你应该写一个[mcve],这样我们就可以有更多的实际讨论。 –

回答

1

正如您发现更改对象b指的是不会修改对象(或其子结构)。如果你想这样做,你需要一个类似于你的get_the_data_shortcut(a)的方法。即

set_the_data_shortcut(a, newvalue) 

或者你可以有这将返回值存储在底层结构和操作一个方法..

# returns a.substructure2.subsubstructure2 
#   or a.substructure1.subsubstructure1 based on the value of kind 
substruct = get_the_substructure(a, kind) 
substruct.name_of_data1 += 1 
1

Python使用引用类型,就像java一样。 然而,当你做

b = b + 1 

你没有更新你的对象。相反,您正在创建一个新对象并将其分配给变量b

如果你想在数据结构中更新b的值,你应该遵循你的建议并为数据结构编写一个setter。