使用元类和__prepare__
方法,可以在属性被添加到类的命名空间之前拦截它们。有没有办法,尽管它是 hacky,从类的范围内拦截裸表达式。
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?