可归属性

Mit*_*tar 6 python class-properties

我有一个库(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
Run Code Online (Sandbox Code Playgroud)

但它失败了:

'property' object is not iterable
Run Code Online (Sandbox Code Playgroud)

所以我想做一些事情:

class iterable_property(property):
    def __iter__(self):
        # What here?
Run Code Online (Sandbox Code Playgroud)

但我被困在这里.我怎么能得到一个也可以迭代的属性?

Ray*_*ger 10

您的原始代码看起来很好(虽然我不会将局部变量命名为与封闭函数相同的名称).

注意,属性仅适用于新式类,因此您需要从对象继承.此外,您需要从实例调用属性属性.

如果你需要一个class属性,那么属性将不起作用,你需要为类级属性编写自己的描述符:

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
Run Code Online (Sandbox Code Playgroud)