我正在尝试在运行时将类变量转换为实例变量,这与Django ORM中的情况类似,在Django ORM中,各种类型的类变量在运行时都转换为相同类型的实例变量。
我正在使用一个元类将某些类型的类变量收集到一个列表中,然后在实例化时将它们设置为实例变量。我尝试删除原始的类变量并保留它们,但在两种情况下我都得到了不同的结果,而这都是不希望的。
我创建了一个简单的Field对象,该对象使用_ get _和_ set _描述符将值转换为类型。TextField的一个简单实现是Textfield,它对_ get _上的值进行统一编码。
在创建类时,元类将类型为“字段”的所有属性收集到列表中
然后将字段列表设置为类的_meta ['fields']。
当将该类实例化为一个对象时,然后将_meta ['fields']设置为该对象。在一个用例中,原始类var会被事先删除。
然后,我通过创建两个对象进行测试,将一个对象的textfield属性设置为某些文本,期望_ get _和_ set _被调用并且都具有不同的非冲突值。
删除类变量后,设置Field值实际上不会调用_ set或_ get _,并且该字段仅将类型更改为str。当我不删除类变量时,实例化的两个对象共享它们之间的值。
我已经将代码稀释为下面的代码,可以将其保存到文件中,并与python test.py
python shell一起运行或导入其中。将DELETE_CLASS_VAR设置为True将删除类变量(以解决这两个测试用例)。
显然我在这里错过了一些东西。未能使它正常工作,我会在整个过程中使用常规实例变量,但是我非常喜欢Django模型(并且我通过Django代码没有成功),其中在模型上设置的类变量随后在某种程度上成为其实例变量。类型安全性和设置的特定方法。
红糖糍粑
紫衣仙女
相关分类