如何创建可混入的类以使用@property

0 投票
1 回答
570 浏览
提问于 2025-04-18 17:11

我有一个这样的类

class UserProfile(models.Model):
    # ...
    @property
    def get_fields(self):
        return [(field.name, field.value_to_string(self)) for field in UserProfile._meta.fields]

我想在我所有的类中都使用这个属性。所以我想做一个混合类。

class HelperMixin(object):
    @property
    def get_fields(self):
        return [(field.name, field.value_to_string(self)) for field in UserProfile._meta.fields]

问题是,这个属性里面有一些特定于类的代码。我该如何把这些代码变得通用,以便在其他类中也能使用呢?

还有,当我这样使用它时:

class UserProfile(models.Model, HelperMixin)

和这样使用时有什么区别呢?

class UserProfile(HelperMixin, models.Model)

1 个回答

1

使用 self._meta.fields,类的成员在实例中也可以使用:

class HelperMixin(object):
    @property
    def get_fields(self):
        return [(field.name, field.value_to_string(self)) for field in self._meta.fields]

class UserProfile(models.Model, HelperMixin)class UserProfile(HelperMixin, models.Model) 之间的区别在于 MRO(方法解析顺序)。把混合类放在基类前面看起来很自然,但只要基类和混合类没有同名的成员,这样做其实没有什么区别。

撰写回答