在Python 2.5中如何模拟Python 3元类的__prepare__特殊方法?

5 投票
2 回答
823 浏览
提问于 2025-04-16 05:04

在我的项目中,我必须使用Python 2.5(谷歌应用引擎)。在应用程序的某个地方(实际上是一个框架),我需要记录哪些变量被定义了,以及它们被定义的顺序。换句话说,我想在每次处理赋值操作时进行拦截。

如果使用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),也就是说,在C的字典中第一次给变量赋值时,通过一个黑箱ref函数创建这个变量。后续的赋值只是调用这个ref函数的参数。

2 个回答

-1

一个可以开始的地方是查看 PEP-3115,了解一下“当前”的行为,也就是在Python 3之前的行为。

3

你可以给你在类里面用的变量加一个包装,这个包装内部会保持一个计数器,并给每个变量分配一个递增的值。这个包装可以被子类化,用来给变量添加标签或者其他功能。你可以用这个变量的值来排序,然后使用一个普通的Python 2元类来拦截类的创建过程。

Django就是一个使用这种技术的项目,它用来记住在模型类中成员定义的顺序。你可以看看字段是如何创建的; 然后在__cmp__方法的实现中使用这个顺序来保持字段的创建顺序。

撰写回答