2

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

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

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


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

任何人都可以建议我实现这一目标的方法吗?我无权访问已定义类的模块源代码。我可以设法使用垃圾收集器获取类名。

4

3 回答 3

2

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 进行垃圾收集。记住,如果weakref你想要一个weakref.

于 2013-09-26T16:22:32.523 回答
2

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

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

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

class MyClass:
    pass

myobj = MyClass()

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

from othermodule import MyClass, myobj
于 2013-09-26T16:38:52.680 回答
1

id你不能。按名字:

class A:
    def __init__(self,val):
        self.v = val
myInst = A(3)
print eval("myInst").v
>>> 3
于 2013-09-26T16:22:14.750 回答