Ram*_*hum -4 python namespaces object object-address
(当我说"对象地址"时,我的意思是你在Python中键入的用于访问对象的字符串.例如'life.State.step'.大多数时候,最后一个点之前的所有对象都是包/模块,但在某些情况下它们可以是班级或其他对象.)
在我的Python项目中,我经常需要使用对象地址.我必须完成的一些任务:
'life.life.State.step'可能是对象的官方地址,但如果'life.State.step'指向同一个对象,我会想要使用它,因为它更短.)'garlicsim_lib.simpacks.prisoner.prisoner.State.step'可能是对象的官方地址,但我假设用户知道prisoner包的位置,所以我想'prisoner.prisoner.State.step'用作地址.)是否有一个模块/框架来处理这样的事情?我写了一些实用程序模块来做这些事情,但如果有人已经编写了一个更成熟的模块来做这件事,我宁愿使用它.
一个注意事项:请不要试图向我展示这些东西的快速实现.它比看起来更复杂,有很多陷阱,任何快速脏代码都可能在许多重要情况下失败.这些任务需要经过实战考验的代码.
更新:当我说"对象"时,我主要是指类,模块,函数,方法,这些东西.很抱歉没有说清楚.
简答:不.你想要的是不可能的.
答案很长,你认为对象的"地址"不是什么.life.State.step仅仅是在特定时间获得对象引用的方法之一.稍后相同的"地址"可以给你一个不同的对象,或者它可能是一个错误.更重要的是,你的这个"地址" 取决于背景.在life.State.step,最终对象不仅取决于什么life.State和life.State.step是什么life,而是取决于名称在该命名空间中引用的对象.
您的要求的具体答案:
最终对象无法找到您如何引用它,也没有任何代码可以提供给对象."地址"是不是一个名字,它不依赖于对象,它只是一个任意的Python表达式导致对象引用(就像所有的表情做的.)你只能使这项工作,几乎没有,与AREN特定对象"预计会移动,例如课程和模块.即便如此,这些对象可以左右移动,并经常做走动,所以你尝试什么是可能打破.
如上所述,"地址"取决于许多事情,但这部分相当容易:__import__()并且getattr()可以给你这些东西.然而,它们将非常脆弱,特别是当涉及的内容多于属性访问时.它只能远程处理模块中的东西.
"缩短"名称需要仔细检查每个可能的名称,即所有模块和所有本地名称及其所有属性.这将是一个非常缓慢且耗时的过程,并且面对任何带有__getattr__或__getattribute__方法的东西,或者具有不仅仅返回值的属性,都非常脆弱.
和3一样.