Python django在定义对象方法之前是如何设置它的
从django文档中,我知道如果我定义这样的模型:Python django在定义对象方法之前是如何设置它的,python,django,Python,Django,从django文档中,我知道如果我定义这样的模型: class Person(models.Model): SIZE = ( ('S','Small') ('M','Medium') ) size = models.CharField(max_length = 1, choices = SIZE) 然后,我有一个用于Person的方法,名为get\u size\u display() 我想知道django是如何实现这个特性的。它如何知道我有一个名为
class Person(models.Model):
SIZE = (
('S','Small')
('M','Medium')
)
size = models.CharField(max_length = 1, choices = SIZE)
然后,我有一个用于Person的方法,名为get\u size\u display()
我想知道django是如何实现这个特性的。它如何知道我有一个名为
size
的Person
属性,并在方法名中使用它?这是python中的一个技巧吗?Django使用python元类来实现这一点
很像常规的类
是从中创建对象的模板,元类是从中创建类的模板
当您声明常规类时
:
class A(object):
pass
默认元类(type
)是负责创建A
的元类。它通过处理您在A
中定义的内容来创建实际表示A
的对象
在Django中,开发人员将models.Model
的元类更改为自己的自定义元类。通过这样做,他们可以控制从models.Model
派生的任何类的创建,并且可以实现您所提到的“魔法”
Django也使用类似的魔法做很多其他事情
例如,我可以执行以下操作来复制您看到的Django所做的操作:
class MetaClass(type):
@staticmethod
def _create_getter(attr):
def _getter(self):
return getattr(self, attr)
return _getter
def __init__(self, name, bases, attrs):
super(MetaClass, self).__init__(name, bases, attrs)
for attr in attrs:
if not attr.startswith('_'):
setattr(self, 'get_%s' % attr, MetaClass._create_getter(attr))
class Base(object):
__metaclass__ = MetaClass
现在,从Base
派生的任何类都将自动为每个公共属性(那些不是以\u
开头的属性)获取getter方法
以下是正在使用的:
class A(Base):
x = 2
a = A()
print a.get_x()
看好的解释!然而,stackoverflow说我没有足够的声誉投票给你。