避免指针的 Pythonic 方法

Pythonic ways to avoid Pointers

假设我们有一个对象a并且我们想要修改这样结构的数据

a.substructure1.subsubstructure1.name_of_the_data1

还有这个

a.substructure2.subsubstructure2.name_of_the_data2

为了访问这个结构,我们调用了一个外部方法get_the_data_shortcut(a),它被大量参数化(例如,参数subsstructure 指定了return 的子结构)。这看起来非常多余,但是所有这些参数都有一个非常好的默认设置,这很有意义。此外,如果默认分支不可用,此函数将 return 另一个数据分支。

如何修改 get_the_data_shortcut(a)

b = get_the_data_shortcut(a)
b = b + 1

那么,get_the_data_shortcut(a)没有变化,因为Python不是Java。

我需要setter吗?大多数情况下,这不是我的代码,而是由编写 pythonic 代码的人编写的,我正在努力跟上这些标准。

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

b = b + 1

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

如果你想更新数据结构中b的值,你应该按照你的建议,为数据结构写一个setter。

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

set_the_data_shortcut(a, newvalue)

或者,您可以使用一种方法 return 存储值的子结构并对其进行操作..

# 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