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
には、のメソッドが返されます。名前検索ではありませんmymethod
が定義されているときに、実行時に実行されるため
は、MyModelResource
前
super(MyModelResource, self).mymethod()
が定義されているsuper
呼び出しでMyModelResource
を参照問題ありません。
あなたは
super(self.__class_, self).mymethod()
が間違っていることが絶対に正しいです。これは、すべての良いことを台無しにする約super
。 MyModelResource
がサブクラス化され、サブクラスのインスタンスがmymethod
を呼び出す場合、Pythonは無限ループに陥ります。
これは正解です。今、super()を呼び出すメソッドを定義しなければならない場合はどうしたらいいですか?私は明らかに良いアイデアではないので、スーパー(自己.__ class__、自己)を書くことを避けたい... – mnowotka
問題は私がメソッドを定義する瞬間にクラスの名前を知らないです。私の場合、クラスの作成は次のようになります:type(modelClass .__ class __.__ name__ + "Resource"、(ModelResource)、{"Meta" ...}このメソッドの名前で参照することはできません。 – mnowotka
'mymethod'は' MyModelResource'が定義されるまで定義できません。その場合はクラスデコレータを使用します。クラスデコレータ 'add_mymethod'を例として追加しました。 – unutbu