如何创建可混入的类以使用@property
我有一个这样的类
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(方法解析顺序)。把混合类放在基类前面看起来很自然,但只要基类和混合类没有同名的成员,这样做其实没有什么区别。