有没有一种魔术方法可以重载赋值运算符,例如__assign__(self, new_value)?我想禁止为实例重新绑定:class Protect(): def __assign__(self, value): raise Exception("This is an ex-parrot")var = Protect() # once assigned...var = 1 # this should raise Exception()可能吗?疯了吗 我应该吃药吗?
3 回答
暮色呼如
TA贡献1853条经验 获得超9个赞
使用顶级名称空间是不可能的。当你跑步
var = 1
它将键var和值存储1在全局字典中。这大致相当于调用globals().__setitem__('var', 1)。问题是您不能在运行的脚本中替换全局词典(您可能可以通过弄乱堆栈来进行替换,但这不是一个好主意)。但是,您可以在辅助名称空间中执行代码,并为其全局变量提供自定义词典。
class myglobals(dict):
def __setitem__(self, key, value):
if key=='val':
raise TypeError()
dict.__setitem__(self, key, value)
myg = myglobals()
dict.__setitem__(myg, 'val', 'protected')
import code
code.InteractiveConsole(locals=myg).interact()
这将启动一个REPL,该REPL几乎可以正常运行,但是拒绝任何设置变量的尝试val。您也可以使用execfile(filename, myg)。请注意,这不能防止恶意代码。
添加回答
举报
0/150
提交
取消
