【问题标题】:Get an object from its address [duplicate]从其地址获取对象[重复]
【发布时间】:2013-09-26 16:15:37
【问题描述】:

我想获取一个类对象的实例。我有它的地址和对象的名称。如何创建对象的实例或如何检索相同的对象?

该类在一个 python 模块中定义,我希望它在另一个 python 模块中使用。

我可以使用object id来访问类的对象吗?


我的实际问题是我有一个 Python 模块,其中定义了一个类 (class Myclass)。我正在我的新代码中重用该模块。我希望在我的新文件中访问旧模块中定义的Myclass 的对象。

谁能建议我实现这一目标的方法?我无权访问已定义类的模块源代码。我可以设法通过垃圾收集器获取类名。

【问题讨论】:

  • 对象id不一定和对象在内存中所在的内部地址有任何关系。所以不,不可能从 id 或任何“地址”(无论你从哪里得到)获取 Python 对象。相反,您应该在某个地方制作一个字典,以便以后查找对象时将其存储在其中。
  • 如果你有一个对象的地址(我假设你的意思是对它的引用?)那么这就是你需要与对象交谈的全部内容。
  • 你好乔,我没有对象的引用。我只有物理内存地址(0X14356700)。还有一件事我的原始类是在我无法访问源的文件中定义的。我只是有它的二进制文件来访问或重用代码。
  • @mkreddy 你读过:Python: Get object by id?
  • 一个对象的id()和它在内存中的地址不是一回事。它们恰好在 CPython 中,但这是一个实现细节。

标签: python


【解决方案1】:

id 仅定义为当前存在的元素中该元素唯一的数字*。一些 Python 实现(事实上,除了 CPython 之外的所有主要实现)不返回内存地址。

%~> pypy
Python 2.7.3 (480845e6b1dd219d0944e30f62b01da378437c6c, Aug 08 2013, 17:02:19)
[PyPy 2.1.0 with GCC 4.8.1 20130725 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
And now for something completely different: ``arguably, everything is a niche''
>>>> a = 1
>>>> b = 2
>>>> c = 3
>>>> id(a)
9L
>>>> id(b)
17L
>>>> id(c)
25L

所以你必须保证它内存地址。此外,由于这个原因,Python 不提供 id → object 映射,尤其是当删除原始对象时,可以更改 id 映射到的对象。

你必须问为什么你持有id。如果出于空间原因,请记住容器实际上保存了对项目的引用,因此[a, a, a, a, a] 实际上占用的空间比[id(a), id(a), id(a), id(a), id(a)]; a 少。

您也可以考虑为所有相关项目制作dict{id: val} 并将其存储。这将使val 保持活动状态,因此您可以使用weakrefs 允许对vals 进行垃圾收集。记住,use weakref if you want a weakref

【讨论】:

  • 谢谢大家的回复。我的实际问题是“我有一个 python 模块,其中定义了一个类“Class Myclass”。我在我的新代码中重用该模块。我希望必须访问在旧模块中定义的 Myclass 对象我的新文件。任何人都可以建议我一种方法来实现这一点。我无权访问该类定义的模块。我可以使用垃圾收集器获取类名。
【解决方案2】:

我的实际问题是“我有一个 python 模块,其中定义了一个类“Class Myclass”。我在新代码中重用该模块。我希望旧模块中定义的 Myclass 对象必须可以在我的新文件中访问。任何人都可以建议我一种方法来实现这一点。我无权访问该类已定义的模块。我可以使用垃圾收集器获取类名。

如果您正在重用该模块,那么您可以访问该模块。

例如,如果所述模块创建这样的对象:

class MyClass:
    pass

myobj = MyClass()

然后,您也可以在导入模块时导入该引用:

from othermodule import MyClass, myobj

【讨论】:

  • 谢谢你,我会试试这个,会回复你。
【解决方案3】:

id 你不能。按名称:

class A:
    def __init__(self,val):
        self.v = val
myInst = A(3)
print eval("myInst").v
>>> 3

【讨论】:

  • 只有当持有对该对象的引用的变量实际上在范围内时才有效。
猜你喜欢
  • 2018-10-19
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多