zoukankan      html  css  js  c++  java
  • python如何从内存地址上加载pythn对象

    python如何从内存地址上加载pythn对象

    在python中我们可以通过id函数来获取某个python对象的内存地址,或者可以通过调用对象的__repr__魔术函数来获取对象的详细信息

    def tt():
        print(111)
    print(tt.__repr__())
    print(id(tt))
    
    

    但是不知大家是否想过,其实这个内存地址可以直接加载python对象的。有两种方法:

    1. PyObj_FromPtr

    在_ctypes包中,就提供PyObj_FromPtr这个api去实现我们的需求。代码如下

    def tt():
        print(111)
    print(tt.__repr__())
    print(_ctypes.PyObj_FromPtr(id(tt)))
    

    运行结果如下:

    <function tt at 0x106c628c8>
    <function tt at 0x106c628c8>
    

    2. gc.get_objects

    我们也可以通过gc的get_objects方法来实现。先来看一下官方介绍

    gc.get_objects()
    Returns a list of all objects tracked by the collector, excluding the list returned.
    

    大致意思为,获取所有可以追踪的对象。所以,我们可以通过第二种方式来实现从特定内存地址加载python对象

    def tt():
        print(111)
    print(tt.__repr__())
    
    for i in gc.get_objects():
        if id(i) == id(tt):
            print(i)
            
    

    方法很简单,通过gc.get_objects获取所有对象,一一检查这些对象的内存地址是否与给定的内存地址相符,如果相符则返回对象。

    结论

    额,很扯淡的东西,最好不要乱用这种东西。因为出错的话,try except语句都无法捕捉到这种异常。就当是了解一下吧

  • 相关阅读:
    HTML DOM教程 14HTML DOM Document 对象
    HTML DOM教程 19HTML DOM Button 对象
    HTML DOM教程 22HTML DOM Form 对象
    HTML DOM教程 16HTML DOM Area 对象
    ubuntu 11.04 问题 小结
    VC6.0的 错误解决办法 小结
    boot.img的解包与打包
    shell里 截取字符串
    从零 使用vc
    Imagemagick 对图片 大小 和 格式的 调整
  • 原文地址:https://www.cnblogs.com/potatsoSec/p/12156959.html
Copyright © 2011-2022 走看看