私は、すべてのUUIDと参照を割り当てる必要があるため、モデルの継承を使用するDjangoアプリケーションを作成しています。私はobjmodule、objclass、およびUUIDが自動的に設定されていることを確認したいと思いますPythonとDjangoの継承とファクトリ関数
class BaseElement(models.Model):
uuid = models.CharField(max_length=64, editable=False, blank=True, default=lambda:unicode(uuid4()))
objmodule = models.CharField(max_length=255, editable=False, blank=False)
objclass = models.CharField(max_length=255, editable=False, blank=False)
class ChildElement(BaseElement):
somefield = models.CharField(max_length=255)
:ここでは、基本クラスの簡易版です。私はthis postから、自分自身のコンストラクタを書くことによってそれを行うことは悪い考えであり、工場の関数を書いたほうが良いことを知っています。だから私のBaseElementとChildElementは次のようになります:
class BaseElement(models.Model):
uuid = models.CharField(max_length=64, editable=False, blank=True, default=lambda:unicode(uuid4()))
objmodule = models.CharField(max_length=255, editable=False, blank=False)
objclass = models.CharField(max_length=255, editable=False, blank=False)
def set_defaults(self):
self.objmodule = unicode(self.__class__.__module__)
self.objclass = unicode(self.__class__.__name__)
self.uuid = unicode(uuid4())
class ChildElement(BaseElement):
somefield = models.CharField(max_length=255)
@staticmethod
def create(*args, **kwargs):
ce = ChildElement(*args, **kwargs)
ce.set_defaults()
return ce
これは動作します。私はChildElement.create(somefield="foo")
と呼ぶことができ、uuid
,objmodule
、objclass
のフィールドが正しく設定された適切なオブジェクトが得られます。しかし、ChildElement2
とChildElement3
のようなクラスを作成すると、まったく同じ静的ファクトリ関数が挿入されています。コードの重複が悪いので、これは私を怒らせます。
通常の方法ではBaseElement
にcreate
ファクトリ関数を挿入していますが、私は(まだ作成されていないため)ハンドルを持たないためここにはできませんメソッドを呼び出したオブジェクトのクラスに関する情報。
uuid
、
objmodule
、および
objclass
の値を設定しますので、持っているので、私は
BaseElement
クラスにこの工場を移行することができます方法はありますか?
これはまさに私が探していたものです。 '@ classmethod'について私に思い出させてくれてありがとう。私が頻繁に使うものではありません。 – Pridkett
Pythonでは、 '@ staticmethod'にはまれなケースがあります。これは、あまり頻繁に使用しない方がいいでしょう。しばしば何かが '@ classmethod'でなければモジュールで単純なトップレベル関数として適切です。 –