如果我有这样的代码:
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++.
答案 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)