2010-12-27 16 views
2

私は既存のDjangoライブラリを使用しています。抽象化したいクラスを作成しています。PythonでDjangoの抽象基本クラスのように動作するクラスを作成するにはどうすればよいですか?

問題のクラスがBaseFooであるとします。

現在、実装には基本クラスBaseFooがあります。

延長するクラスがBaseFooになるたびに、メタクラスがそのクラスをクラスのリストに追加します。私が何か書くことができるようにしたいと思い

if name not in ('BaseFoo',): 
     class_list.append(new_cls) 

class MyBaseFoo(BaseFoo): 
    class Meta: 
     abstract = True 

をそして、メタクラスのスキップを持っていることは、明示的にクラス名のハードコードされたテストを行うことによってBaseFooを追加しません。すべてBaseFoo抽象オブジェクトです。だから私はDjangoがモデルで同じことをやっているのか、これを自分でやるための簡単でエレガントな方法があるのだろうかと思っています。

Djangoがモデルを定義するために使用するコードのいくつかを見てきましたが、私はいくつかのポインタを使うことができました。また、必ずclass Metaを使用せずにこれを行うさらに簡単な方法がある場合は、私もそれに開いています。私は、このソリューションによって、特に興奮していないです

注:

class MyBaseFoo(BaseFoo): 
    abstract = True 

class ActualFoo1(MyBaseFoo): 
    abstract = False 

class ActualFoo2(MyBaseFoo): 
    abstract = False 
+1

'nameは( 'BaseFoo')ではありませんあなたが思っていることをしません - ' name'が 'BaseFoo'の部分文字列であるかどうかをチェックします(' name = 'Foo''の場合、これは偽)。シングルトンタプルを作成するには '( 'BaseFoo'、)'(末尾のカンマに注意してください)を使用しますが、 'name!= 'BaseFoo''はなぜですか? – delnan

+0

+1(オフセット)なぜdownvoteですか?この質問はどうして間違っていますか? –

+0

ええ、私のコードに誤字がありました。これは難読化されたコードです...元のバージョンは実際には '' BaseFoo '、' OtherBaseFoo ')ではありませんでしたが、単純化したかったのです。 –

答えて

3

具体的なクラスにFalseに抽象的に設定する必要はありません - それは唯一の抽象クラスでこの設定を持っているのに十分だ:

代わりに、Python 2.6でクラスデコレータを使用することもできますが、@ abstractデコレータのclass_listからクラスを削除する必要があります。これは、デコレータが呼び出されたときに既に作成されているため(メタクラスは既に呼び出される)。

+0

+1すてきな解決策です。 'abstract = False'は実際には抽象的になっていますか? – kevpie

+0

@kevpie:それはもともとはありませんでしたが、今はあります。 –

関連する問題