程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在Python中设置只读属性?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在Python中设置只读属性??

开发过程中遇到在Python中设置只读属性?的问题如何解决?下面主要结合日常开发的经验,给出你关于在Python中设置只读属性?的解决方法建议,希望对你解决在Python中设置只读属性?有所启发或帮助;

尽管具有动态功能,但Python不允许猴子修补内置类型,例如file。它甚至可以通过修改__Dict__这种类型的来防止您这样做—该__Dict__属性返回包装在只读代理中的字典,因此分配file.writefile.__Dict__['write']失败都会失败。至少有两个很好的理由:

  1. C代码期望file内置类型与Pyfile类型结构以及内部使用file.writePyfile_Write()函数相对应。

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

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

但是,如果您真的知道自己在做什么,则可以使用低级API,例如,ctypes可以挂接到实现并获取类型Dict。例如:

# WARNING: do NOT attempt this in production code!

import ctypes

def 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.value

def magic_flush_mro_cache():
    ctypes.PyDLL(NonE).PyType_ModifIEd(ctypes.py_object(object))

# monkey-patch file.write
dct = 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 effect
magic_flush_mro_cache()

# magic!
import sys
sys.stdout.write('Hello world\n')

解决方法

鉴于Python的动态性,如果无法实现,我会感到震惊:

我想更改的实现sys.stdout.write

我试图简单地写成这样:

original_stdoutWrite = sys.stdout.write

def new_stdoutWrite(*a,**kw):
    original_stdoutWrite("The new one was called! ")
    original_stdoutWrite(*a,**kw)

sys.stdout.write = new_stdoutWrite

但这告诉我AttributeError: 'file' object attribute 'write' is read-only

这是防止我做可能(可能)愚蠢的事情的好尝试,但是我真的很想继续做下去。我怀疑解释器有某种可以修改的查找表,但我在Google上找不到类似的表。__setattr__也不起作用-
它返回了与只读属性完全相同的错误。

我很想寻找一个Python
2.7解决方案,如果那很重要的话,尽管没有理由拒绝抛出适用于其他版本的答案,因为我怀疑将来其他人会在这里看到有关其他版本的类似问题。

大佬总结

以上是大佬教程为你收集整理的在Python中设置只读属性?全部内容,希望文章能够帮你解决在Python中设置只读属性?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。