正如其他人所提到的,没有直接的方法可以做到这一点。但是对于类成员,可以进行覆盖,这对许多情况都很有用。
正如Ryan Kung所提到的,一个包的AST可以被插装,以便如果分配的类实现了特定的方法,则所有分配都可以具有副作用。在他的工作基础上,处理对象创建和属性分配情况,修改后的代码和完整描述在此处提供:
https://github.com/patgolez10/assignhooks
该包可以通过以下方式安装:
pip3 install assignhooks
示例<testmod.py>:
class SampleClass():
name = None
def __assignpre__(self, lhs_name, rhs_name, rhs):
print('PRE: assigning %s = %s' % (lhs_name, rhs_name))
if rhs.name is None:
rhs.name = lhs_name
return rhs
def __assignpost__(self, lhs_name, rhs_name):
print('POST: lhs', self)
print('POST: assigning %s = %s' % (lhs_name, rhs_name))
def myfunc():
b = SampleClass()
c = b
print('b.name', b.name)
将其翻译为中文:用于工具化,例如 <test.py>。保留HTML,不解释。
import assignhooks
assignhooks.instrument.start()
import testmod
assignhooks.instrument.stop()
testmod.myfunc()
将产生以下结果:
$ python3 ./test.py
POST: lhs <testmod.SampleClass object at 0x1041dcc70>
POST: assigning b = SampleClass
PRE: assigning c = b
POST: lhs <testmod.SampleClass object at 0x1041dcc70>
POST: assigning c = b
b.name b
exec in d
来执行这段代码,其中 d 是某个字典。如果代码在模块级别上,每个赋值都应该被发送回字典。你可以在执行后恢复你的值/检查值是否改变,或者拦截字典赋值,即用另一个对象替换变量的字典。 - Ant6nScreenUpdating = False
是不可能的。 - Winand__all__
属性 来防止私有数据被导出,这是 Python 标准库常用的方法。 - Benx=1
和x=2
会报错。 - Poojan