对象的唯一标识符(从十六进制转换为十进制)
我正在学习Python(现在在上类)。在这个网站上(页面底部),第一个练习(在13.7. Exercises下)说:
创建并打印一个Point对象,然后使用id来打印这个对象的唯一标识符。把十六进制形式转换成十进制,并确认它们是否匹配。
我需要帮助,因为我不太确定我该怎么做。
如果我这样做:
class Point:
pass
print Point()
print id(Point)
我得到这个输出:
<__main__.Point instance at 0xb71c496c>
3072094252
那么,我应该这样做这个练习的第一部分吗?接下来该怎么办?我猜第二行是十进制数字(我说得对吗?)。那么第一行呢?怎么把它转换成十进制?
1 个回答
6
把第二个数字转换成十六进制,使用hex()
函数,然后检查它是否在第一个数字里:
p = Point()
hexadecimal_id = hex(id(p))
present = hexadecimal_id in repr(p)
注意,我首先保存了一个引用到Point()
这个实例;否则你会得到一个新的实例,可能会有一个新的id()
值。
另外,不要把类和实例搞混;类本身也是一个对象,所以它也有自己的id()
值。
如果你想反过来做,就得把十六进制字符串解析出来;如果你假设它是最后一个空格后面的部分,可以这样做:
hexadecimal_id = repr(p).rpartition(' ')[-1][:-1]
present = int(hexadecimal_id, 16) == id(p)
这里,str.rpartition()
方法会在最后一个空格处分割字符串,我们用[-1]
(最后一个元素)来获取它后面的部分,然后把结果缩短一个字符,以去掉最后的>
字符。
一旦你得到了十六进制数字,就可以用int()
函数把它当作整数来解释,记得指定进制为16。
示例:
>>> class Point:
... pass
...
>>> p = Point()
>>> id(p)
4300021632
>>> hex(id(p))
'0x1004d1f80'
>>> p
<__main__.Point instance at 0x1004d1f80>
>>> hex(id(p)) in repr(p)
True
>>> # the other direction
...
>>> repr(p).rpartition(' ')[-1][:-1]
'0x1004d1f80'
>>> hexadecimal_id = repr(p).rpartition(' ')[-1][:-1]
>>> int(hexadecimal_id, 16)
4300021632
>>> int(hexadecimal_id, 16) == id(p)
True