gpt4 book ai didi

python使用内部类动态创建类

转载 作者:太空狗 更新时间:2023-10-29 21:29:36 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com