栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Python中设置只读属性?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Python中设置只读属性?

尽管具有动态功能,但Python不允许猴子修补内置类型,例如

file
。它甚至可以通过修改
__dict__
这种类型的来防止您这样做—该
__dict__
属性返回包装在只读代理中的字典,因此分配
file.write
file.__dict__['write']
失败都会失败。至少有两个很好的理由:

  1. C代码期望

    file
    内置类型与
    PyFile
    类型结构以及内部使用
    file.write
    PyFile_Write()
    函数相对应。

  2. Python对类型实现属性访问的缓存,以加快方法查找和实例方法的创建。如果允许直接分配给类型dict,则此缓存将被破坏。

用Python实现的类当然可以使用猴子补丁,它可以很好地处理动态修改。

但是,如果您真的知道自己在做什么,则可以使用低级API,例如,

ctypes
可以挂接到实现并获取类型dict。例如:

# WARNING: do NOT attempt this in production pre!import ctypesdef magic_get_dict(o):    # find address of dict whose offset is stored in the type    dict_addr = id(o) + type(o).__dictoffset__    # retrieve the dict object itself    dict_ptr = ctypes.cast(dict_addr, ctypes.POINTER(ctypes.py_object))    return dict_ptr.contents.valuedef magic_flush_mro_cache():    ctypes.PyDLL(None).PyType_Modified(ctypes.py_object(object))# monkey-patch file.writedct = magic_get_dict(file)dct['write'] = lambda f, s, orig_write=file.write: orig_write(f, '42')# flush the method cache for the monkey-patch to take effectmagic_flush_mro_cache()# magic!import syssys.stdout.write('hello worldn')


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/639074.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号