5

在我的项目中,我必须坚持使用 Python 2.5(Google App Engine)。在应用程序的某个地方(实际上是一个框架),我必须跟踪定义了哪些变量以及定义它们的顺序,换句话说,我想在处理赋值运算符时进行拦截。

使用 Python 3,我将定义一个元类 M,其__prepare__方法返回一个智能字典,该字典跟踪它何时被访问。然后我只需要使用元类 M 执行类语句中的所有内容。

有没有办法在 Python 2.5 中模拟这个?

我想实现的示例

使用 Python 3 的元类方法,我可以实现像引用一样工作的变量,例如 M 可以这样

# y is a callable
class C(metaclass=M):
    x = ref(y)
    x = 1

将与 等价(直到创建 C)y(1),即黑盒ref函数对 C 字典中变量的第一次赋值会创建此变量。进一步的赋值只是调用 ref 函数的参数。

4

2 回答 2

3

您可以使用包装器包装您填充类的变量,该包装器在内部保留一个计数器并分配一个递增的值。包装器可以被子类化以用于标记或向变量添加行为。您将使用变量值对它们进行排序,并使用常规 Python 2 元类来拦截类的创建。

Django 是使用这种技术来记住在模型类上定义成员的顺序的项目之一。您可以查看字段的创建位置;然后在__cmp__方法的实现中使用它来保持字段的创建顺序。

于 2010-10-06T09:59:56.087 回答
-1

一个起点是查看PEP-3115并阅读“当前”行为,例如在 Python 3 实施之前的当前行为。

于 2010-10-06T08:43:57.520 回答