当你在Python中调用object.__repr__()方法时,你会得到类似这样的结果:
< __main__。测试对象位于0x2aba1c0cf890>
如果你重载__repr__(),除了调用super(Class, obj).__repr__()和reexing它,有没有任何方法来获得内存地址?
当你在Python中调用object.__repr__()方法时,你会得到类似这样的结果:
< __main__。测试对象位于0x2aba1c0cf890>
如果你重载__repr__(),除了调用super(Class, obj).__repr__()和reexing它,有没有任何方法来获得内存地址?
当前回答
你可以这样重新实现默认的repr:
def __repr__(self):
return '<%s.%s object at %s>' % (
self.__class__.__module__,
self.__class__.__name__,
hex(id(self))
)
其他回答
如果__repr__重载,你可以考虑__str__来查看变量的内存地址。
下面是Moshe Zadka在StackOverflow中__repr__和__str__的细节。
虽然在默认的CPython实现中,id(object)确实可以获取对象的地址,但这通常是无用的…你不能对纯Python代码中的地址做任何事情。
只有在C扩展库中才能使用该地址……在这种情况下,获取对象的地址是很简单的,因为Python对象总是作为C指针传递。
使用ctypes,您可以使用
>>> import ctypes
>>> a = (1,2,3)
>>> ctypes.addressof(a)
3077760748L
文档:
addressof(C实例)->整数 返回C实例内部缓冲区的地址
注意,在CPython中,当前id(a) == ctypes.addressof(a),但是ctypes.addressof(a)。addressof应该返回每个Python实现的真实地址,如果
支持Ctypes 内存指针是一个有效的概念。
编辑:增加关于ctypes的解释器独立性的信息
只是为了响应Torsten,我无法在常规python对象上调用addressof()。此外,id(a) != addressof(a)。这是在CPython中,其他什么都不知道。
>>> from ctypes import c_int, addressof
>>> a = 69
>>> addressof(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: invalid type
>>> b = c_int(69)
>>> addressof(b)
4300673472
>>> id(b)
4300673392
你可以这样重新实现默认的repr:
def __repr__(self):
return '<%s.%s object at %s>' % (
self.__class__.__module__,
self.__class__.__name__,
hex(id(self))
)