Python 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是如何实现这个特性的。它如何知道我有一个名为

从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说我没有足够的声誉投票给你。