我在哪里索引链?

时间:2016-06-06 14:12:51

标签: python

如果我有这样的代码:

x.y.z = 12

我可以推断z成员正在从__setattr__的调用中编入索引。但是,如果我有这样的事情:

foo = x.y.z # situation 1
bar = x.y.z.bar # situation 2

如果我想根据它是否在索引链中的最后位置为z做些特别的事情,我如何确定我所处的上述情况?这种推理在Python中是否可行?

为了更加清晰,我们假设我可以更改所有被索引对象的实现,因此完全可以使用描述符。

我担心这个问题的答案是"你不能这样做"自it is impossible to override = like you can in C++.

以来

2 个答案:

答案 0 :(得分:1)

我不确定你是如何定义'在索引链上的最后一个'。您仍然可以随时在对象上调用更多属性。

但是您可以知道何时将对象作为属性进行访问。如前所述,您可以重载__getattr____getattribute__,但更强大的方法是使用描述符。

这可以帮助您入门:http://nbviewer.jupyter.org/urls/gist.github.com/ChrisBeaumont/5758381/raw/descriptor_writeup.ipynb

或者,还有一个更正式的指南:https://docs.python.org/3/howto/descriptor.html

答案 1 :(得分:0)

使用python覆盖无法做到这一点。唯一的方法是让一个已知的成员意味着“结束”。例如,如果您想知道在长链索引中设置了哪个成员,则需要某种setter:

x.y.z.set(some_value)