gpt4 book ai didi

python - 元类可以从类的作用域中操纵裸表达式吗?

转载 作者:行者123 更新时间:2023-11-28 22:18:35 25 4
gpt4 key购买 nike

使用元类和 __prepare__ 方法,可以在将属性添加到类的命名空间之前拦截它们。有没有一种方法,虽然很老套,但可以从类的作用域中拦截裸露的表达式。

class Class(metaclass=Metaclass):
# Would it be possible to intercept those:
1
2
3

我发现的最接近的语法是为此类表达式保留 _ 名称。

class ClassNamespace(dict):
def __init__(self):
self.expressions = []
super().__init__()

def __setitem__(self, key, value):
if key == '_':
self.expressions.append(value)
else:
super().__setitem__(key, value)

class Metaclass(type):
def __prepare__(metacls, name):
return ClassNamespace()

def __new__(cls, name, bases, namespace):

# Do something with the expressions
print(namespace.expressions)

return super().__new__(cls, name, bases, namespace)

class Class(metaclass=Metaclass):
_ = 1
_ = 2
_ = 3

# prints: [1, 2, 3]

很干净,但是有没有办法在不使用赋值的情况下恢复 1、2 和 3?

最佳答案

没有元类机制支持您尝试做的事情。 1 不会生成名称查找,因此 __prepare__ 没有帮助。见鬼,1 作为语句本身根本不会生成任何字节码,因为它已被优化掉。

即使您愿意让元类找到类主体的函数对象并用检测过的字节码替换它的字节码以 try catch 这些表达式,它仍然找不到字节码中原始表达式的痕迹,并且没有任何可检测的东西。此外,元类无法参与类主体的原始编译过程。

最合理(仍然非常疯狂)的选择似乎是让元类找到类的原始源代码,解析它,修改 AST,重新编译,并替换类主体的原始代码对象。这永远不会在交互模式下工作(因为源代码不保存在交互模式下),这是为什么这是一个坏主意的许多其他原因之一。

关于python - 元类可以从类的作用域中操纵裸表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50420295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com