我正在使用django-tastypie,我需要从django模型中创建类似的类:
class MyModelResource(ModelResource):
class Meta:
queryset = MyModel.objects.all()
allowed_methods = ['get']
由于我的django应用程序中有很多模型,所以我不想重复自己,而是使用type()函数来创建所有这些资源类。问题是我不知道如何处理内部的“Meta”类。
您能否举一个示例,说明如何使用type()与内部类一起动态创建一个类?
最佳答案
class MyModel(object) : pass
modelClass = MyModel()
class ModelResource(object):
def mymethod(self):
print('got here')
Meta = type('Meta', (object, ), {'allowed_methods': ['get']})
def add_mymethod(cls):
def mymethod(self):
super(cls, self).mymethod()
cls.mymethod = mymethod
return cls
name = modelClass.__class__.__name__ + "Resource"
MyModelResource = add_mymethod(type(name, (ModelResource, ),
{'Meta':Meta, }))
print(MyModelResource.Meta)
# <class '__main__.Meta'>
m = MyModelResource()
m.mymethod()
# got here
就
Meta
而言,内部类MyModelResource
只是另一个属性。就
MyModelResource
而言,方法也只是属性。实际上,您在MyModelResource.__dict__
中定义了一个函数,并定义了Python属性查找机制使
inst.mymethod
返回绑定(bind)的方法。在
MyModelResource
调用中引用super
没问题super(MyModelResource, self).mymethod()
在定义
MyModelResource
之前,是因为名称查找是在运行时执行的,而不是在定义mymethod
时执行的。你是绝对正确的
super(self.__class_, self).mymethod()
是错的。这将破坏有关
super
的所有好处。如果将MyModelResource
进行子类化,并且该子类的一个实例将调用mymethod
,则Python将陷入无限循环。