有没有办法在Python 2.5中模拟Python 3-metaclass的__prepare__特殊方法?

时间:2010-10-06 07:31:17

标签: python python-3.x metaclass

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

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

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

我希望实现的目标

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

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

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

2 个答案:

答案 0 :(得分:3)

您可以使用内部保留计数器并指定增加值的包装器来包装填充类的变量。包装器可以是子类,用于标记或向变量添加行为。您可以使用变量值对它们进行排序,并使用常规Python 2元类来拦截类创建。

Django是使用此技术记住在模型类上定义成员的顺序的项目之一。你可以看看where the fields are created;然后将其用于__cmp__方法的实现,以使字段按创建顺序保留。

答案 1 :(得分:-1)

一个开始的地方是查看PEP-3115并阅读“当前”行为,例如实现Python 3之前的当前行为。