0

私は現在djangoアプリを実装しています。このため、Djangoの構文と一致する構文を使用しようとしています...

だからここに私が試しているものがあります:

class Blablabla(Model):

    #this contains Blablabla's options
    class Meta:
        sort_key = lambda e: e

sort_keyは(ソートの目的で)重要な関数ですが、もちろん、Metaのメソッドとして理解されています(これは絶対に私が望むものではありません)!!!

これに対する回避策はありますが、それでもこの構文を使用できますか?

編集:ちょうど重要な精度...私が書いたコードは、ライブラリを使用する誰かによって書かれることになっています!だから私は汚いトリックをしたくないのです。そして、DjangoではYESです。これは、実際にはオプションにのみ使用されます...もちろん、Metaはクラスですが、クラスとして使用されないため、「クラスとしては表示されません」と言います。インスタンス化しないでください。クラスメソッドを配置せず、クラス属性のみを配置します...には、これからすべてを抽出し、宣言されたすべてのオプションを処理Modelするメタクラスがあります...しかし、それだけです!Metaこれは、オプションの単なるプレースホルダーです。

しかし、それは本当です。Djangoの関数であるオプションを見たことがありません...したがって、Nedに従って、この並べ替え関数をそのメソッドとしてModelオーバーライドする必要があると宣言します...

4

4 に答える 4

2

一般に、

class Meta(object):
    sort_key= staticmethod(lambda e: e)

Djangoが「メタ」メンバーを移植するために行う魔法がこのような装飾された方法でうまく対処するかどうかはわかりませんが、そうでない固有の理由はわかりません。

于 2010-09-16T23:36:41.127 に答える
2

なんで入れようとしているsort_keyMetaMetaDjangoオプションに使用されますが、独自のメソッドを配置する場所ではありません。モデルにはメソッドを定義できます。私はあなたが次のような単純なものが欲しいと思います:

class Blablabla(Model):

    def sort_key(self, e):
        return e
于 2010-09-17T02:08:47.893 に答える
0

OPはコメントに「『メタ』は実際にはクラスとして見られるべきではない」と書いています。その場合、つまり、Meta実際にはクラスではないときにDjangoが生き残ることができる場合(非常に大きな「if」)、最も単純な解決策を避けたいというOPの本当に奇妙な欲求を満たすことができます(問題をラップstqticfunctionするだけですlambda) 。

基本的に、これには、属性ルックアップがクラスの記述子オブジェクトの通常の使用をバイパスするオブジェクトを生成する(かなり奇妙な)メタクラスを作成する必要があります(すべての関数は記述子オブジェクトです:つまり、__get__Pythonがルックアップ時に通常使用するメソッドがありますクラスまたはそのインスタンスの属性)。

このばかげた回転の一般的な考え方は次のようになります...:

class MetaNotAClass(type):
   def __new__(mcl, clasname, bases, clasdict):
     if bases:
         usedict = {}
     else:
         usedict = clasdict
     usedict['__foo'] = clasdict
     return type.__new__(mcl, clasname, bases, usedict)
   def __getattr__(cls, atname):
      try: return getattr(cls, '__foo')[atname]
      except KeyError: raise AttributeError, atname

class NotAClass:
  __metaclass__ = MetaNotAClass


class Bah(NotAClass):
  def f(): return 'weird!'

print Bah.f()

もちろん、クラスであると期待 Bahするものはすべて壊れます(しかし、それは「実際にはクラスとして見られるべきではない」と言うので、基本的にそれがあなたが求めているものです:それがそうであると信じるコードを壊す「クラスとして見られる」!-)。

于 2010-09-17T00:18:17.903 に答える
0

単純なモジュール(meta?)を作成して追加sort_keyするだけではいけませんか?次に、include必要な場所に移動します...

于 2010-09-17T07:47:44.857 に答える