使用元类创建属性(类型化和有序)的类定义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用元类创建属性(类型化和有序)的类定义相关的知识,希望对你有一定的参考价值。

Like Django.models, GAE.db.model or SqlAlchemy definitions
  1. import os
  2.  
  3. class _FieldBase_:
  4. _defines=[]
  5. def __init__(self,*a):
  6. _FieldBase_._defines.append(self)
  7.  
  8. class _FieldedMetaClass_(type):
  9. def __init__(cls, name, bases, dct):
  10. super(_FieldedMetaClass_, cls).__init__(name, bases, dct)
  11. if name!="Form":
  12. fields_to_name = dict([(slot,name) for name,slot in dct.items() if isinstance(slot,_FieldBase_)])
  13. cls.fields = [(fields_to_name[obj],obj ) for obj in _FieldBase_._defines]
  14. _FieldBase_._defines=[] # reset list !!!
  15.  
  16. class Form (object):
  17. __metaclass__ = _FieldedMetaClass_
  18.  
  19. def __repr__(self):
  20. l=["Form '%s'"%self.__class__.__name__]
  21. l+=["* %-10s : %s"%(f,t.__class__.__name__) for f,t in self.fields]
  22. return os.linesep.join(l)
  23.  
  24. class FieldInt(_FieldBase_):
  25. def __init__(self,*a):
  26. _FieldBase_.__init__(self,a)
  27.  
  28. class FieldString(_FieldBase_):
  29. def __init__(self,*a):
  30. _FieldBase_.__init__(self,a)
  31.  
  32. class Form1(Form):
  33. name = FieldString(1)
  34. surname = FieldString(2)
  35. age = FieldInt(3)
  36.  
  37. class Form2(Form):
  38. nb = FieldInt(1)
  39. title = FieldString(2)
  40.  
  41. print Form1()
  42. print Form2()

以上是关于使用元类创建属性(类型化和有序)的类定义的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义元类的类的所有子类共享相同的属性,即使它们不应该

为啥元类不能访问由元类定义的类的子类继承的属性?

3.1.18 元类的练习

按类型创建的类的python元类

在 Python 中使用 attr 模块和元类

python中的元类作用?