作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 django-tastypie,我需要从我的 django 模型中创建这样的类:
class MyModelResource(ModelResource):
class Meta:
queryset = MyModel.objects.all()
allowed_methods = ['get']
因为我的 Django 应用程序中有很多模型,所以我不想重复自己,而是使用 type() 函数来创建所有这些资源类。问题是我不知道如何处理这个内部“元”类。
能否举例说明如何使用 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
就 MyModelResource
而言,内部类 Meta
只是另一个属性。
就 MyModelResource
而言,方法也只是属性。其实,你在MyModelResource.__dict__
中定义了一个函数,Python的属性查找机制导致 inst.mymethod
返回绑定(bind)的方法。
在super
调用中引用MyModelResource
没有问题
super(MyModelResource, self).mymethod()
在定义 MyModelResource
之前,因为名称查找是在运行时执行的,而不是在定义 mymethod
时执行的。
你说的对
super(self.__class_, self).mymethod()
错了。这会破坏 super
的所有优点。如果 MyModelResource
被子类化,并且子类的实例调用 mymethod
,那么 Python 将陷入死循环。
关于python使用内部类动态创建类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13588279/
我是一名优秀的程序员,十分优秀!