7

クラスのいくつかのパラメーターをクラス プロパティとして期待するライブラリ (django-piston) があります。この値をメソッドで動的に定義したいと思います。だから私は次のようなことをしたかった:

class MyHandler(BaseHandler):
    @property
    def fields(self):
        fields = self.model._meta.fields + self.model._meta.virtual_fields
        # Do something more with fields
        return fields

しかし、それは失敗します:

'property' object is not iterable

だから私は次のようなことをしたかった:

class iterable_property(property):
    def __iter__(self):
        # What here?

しかし、ここで行き詰まりました。反復処理も可能なプロパティを取得するにはどうすればよいですか?

4

3 に答える 3

12

元のコードは問題ないように見えます (ただし、ローカル変数に囲んでいる関数と同じ名前を付けていませんでした)。

プロパティは新しいスタイルのクラスでのみ機能するため、 objectから継承する必要があることに注意してください。また、インスタンスからプロパティ属性を呼び出す必要があります。

クラス属性が必要な場合、プロパティは機能せず、クラス レベル プロパティの独自の記述子を記述する必要があります。

class ClassProperty(object):
    def __init__(self, func):
        self.func = func
    def __get__(self, inst, cls):
        return self.func(cls)

class A(object):
    model_fields = ['field1', 'field2', 'field3']

    @ClassProperty
    def fields(cls):
        return cls.model_fields + ['extra_field']

print A.fields
于 2011-11-19T23:51:48.810 に答える
1

Sven Marnach は私に正しい方向を示してくれました。プロパティ クラスで反復のサポートが欠落しているという問題ではなく、クラスで呼び出されたことが問題でした。だから私は作った:

class class_property(property):
    def __get__(self, instance, type):
        if instance is None:
            return super(class_property, self).__get__(type, type)
        return super(class_property, self).__get__(instance, type)

そしてそれは今動作します。;-)

于 2011-11-20T10:51:51.177 に答える
0

私が物事を正しく理解していれば、django-piston では、ハンドラーはクラス属性としてmodelandを持つことができます。fields

もしそうなら、あなたの問題は次のように解決できます:

class MyHandler(BaseHandler):
    model = Post
    class __metaclass__(type):
        @property
        def fields(cls):
            fields = cls.model._meta.fields + cls.model._meta.virtual_fields
            # Do something more with fields
            return fields
于 2011-11-20T01:07:31.510 に答える