Метакласс и метод __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 без использования присваиваний?