Я делаю Django как ORM для моего учебного проекта и потому, что нам не разрешено использовать существующие ORM (если вы хотите использовать его, вы должны его самим закодировать) и просто для обучения себя, я думал, что такой же ORM, как в Django, будет хорошо.Как сделать трюк метакласса, подобный Django
В ORM я не буду делать определения моделей в том же стиле, что и в Django. то есть.
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
Django использует метаклассы и в моем проекте я использую тоже, но у меня есть проблема с тем, что метаклассы построить классов не экземпляры и поэтому все атрибуты являются атрибутами класса и распределяются между всеми экземплярами.
Это общий пример того, что я пробовал, но из-за того, что я сказал ранее, это не будет работать:
def getmethod(attrname):
def _getmethod(self):
return getattr(self, "__"+attrname).get()
return _getmethod
def setmethod(attrname):
def _setmethod(self, value):
return getattr(self, "__"+attrname).set(value)
return _setmethod
class Metaclass(type):
def __new__(cls, name, based, attrs):
ndict = {}
for attr in attrs:
if isinstance(attrs[attr], Field):
ndict['__'+attr] = attrs[attr]
ndict[attr] = property(getmethod(attr), setmethod(attr))
return super(Metaclass, cls).__new__(cls, name, based, ndict)
class Field:
def __init__(self):
self.value = 0;
def set(self, value):
self.value = value
def get(self):
return self.value
class Mainclass:
__metaclass__ = Metaclass
class Childclass(Mainclass):
attr1 = Field()
attr2 = Field()
a = Childclass()
print "a, should be 0:", a.attr1
a.attr1 = "test"
print "a, should be test:", a.attr1
b = Childclass()
print "b, should be 0:", b.attr1
Я пытался для поиска от источника Djangos, но это слишком сложно для меня, чтобы понять и «Магия», кажется, где-то скрыта.
Вопрос прост, как Django делает это в очень упрощенном примере?