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)
#
m = MyModelResource()
m.mymethod()
# got here
就Meta而言,内部类只是MyModelResource的另一个属性。在
就MyModelResource而言,方法也是属性。实际上,您在MyModelResource.__dict__中定义了一个函数,以及Python属性查找机制
使inst.mymethod返回一个绑定的方法。在
在super调用中引用MyModelResource没有问题
^{pr2}$
在定义MyModelResource之前,因为名称查找是在运行时执行的,而不是在定义mymethod时执行的。在
你是绝对正确的super(self.__class_, self).mymethod()
是错误的。这将破坏super的所有优点。如果MyModelResource是子类,并且子类的一个实例调用mymethod,那么Python将陷入一个无限循环。在