当前位置: 首页 > 面试题库 >

在Python中设置只读属性?

濮阳原
2023-03-14
问题内容

鉴于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不允许猴子修补内置类型,例如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')


 类似资料:
  • 问题内容: 我不知道何时属性应该是私有的,是否应该使用属性。 我最近读到,setter和getters不是pythonic,我应该使用属性装饰器。没关系。 但是,如果我有属性,那一定不能从类外部设置,而是可以读取的(只读属性)。这个属性应该是私有的吗?我所说的私有是指下划线吗?如果是,那么不使用getter怎么读?我现在知道的唯一方法是写 这样我就可以读取属性,但是我无法设置它,所以很好。 但是我

  • 本文向大家介绍PowerShell设置文件只读、隐藏属性的方法,包括了PowerShell设置文件只读、隐藏属性的方法的使用技巧和注意事项,需要的朋友参考一下 本文介绍一个PowerShell中如何设置文件属性。我们知道文件的属性有只读、隐藏、系统、存档和无内容索引等5个,只读和隐藏用得比较多,另外三个用得比较少。 一、文件的属性 不知道大家有没有用过attrib.exe这个cmd下的小程序,它可

  • 问题内容: 是否可以通过python中的字典创建对象,使得每个键都是该对象的属性? 像这样: 问题答案: 当然,是这样的: 更新资料 正如布伦特·纳什(Brent Nash)所建议的那样,您还可以通过允许使用关键字参数来使其更加灵活: 然后您可以这样称呼它: 或像这样: 甚至像这样:

  • 问题内容: 我需要使用Java中的Selenium WebDriver 编辑一些字段。由于Selenium甚至不允许我找到该字段,因此我搜索了解决方案,发现最简单的方法可能是使用带有JavaScript Executor 的JavaScript代码段删除属性。 尽管此代码段可从Firefox控制台运行,但已成功从所有输入中删除了该属性,但在Selenium中引发了异常。 JavaScript执行器

  • 本文向大家介绍CMD中使用attrib命令设置文件只读、隐藏属性详解,包括了CMD中使用attrib命令设置文件只读、隐藏属性详解的使用技巧和注意事项,需要的朋友参考一下 本文介绍一个cmd下的一个attrib.exe的小程序,它可以用来设置文件的属性。我们知道文件的属性有只读、隐藏、系统、存档和无内容索引等5个,只读和隐藏用得比较多,另外三个用得比较少。 不知道大家有没有用过attrib.exe

  • 问题内容: 我创建了以下内容… 我现在将如何设置CSS属性,例如? 问题答案: 用途: