Django使用Python的元類來實現這一目標。
就像一個普通class
是從中創建對象的模板,元類是是從創建類的模板。
在聲明常規class
:
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
派生將自動獲取各個它的公共屬性的getter方法的任何類(那些不以_
開頭)。
這裏的正在使用:
class A(Base):
x = 2
a = A()
print a.get_x()
參見[什麼是Python中的元類?(http://stackoverflow.com/q/100003) –