这是一个关于Python Mixins的问题,一般来说可能很有用.我只是使用Django模型,因为这是我最熟悉的用例.
如果mixin继承自该类,它是否设计为与'object'混合使用?
代码示例,更正确或更好,或更好,取决于您想要实现的目标?
这个
class TaggingMixin(models.Model):
tag = models.ForeignKey(Tag)
class Meta:
abstract = True
class MyModel(models.Model, TaggingMixin):
title = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)
或这个:
class TaggingMixin(object):
tag = models.ForeignKey(Tag)
class Meta:
abstract = True
class MyModel(models.Model, TaggingMixin):
title = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)
我认为从对象继承是正确的方法.但我正在网上看到第一个案例的例子......
编辑:我已将我的后续问题转移到一个单独的问题:Django抽象模型与简单Python混合与Python ABCs
jsd*_*ton 70
当谈到模型类时,Django会做很多元魔术,所以不幸的是,Daniel Roseman的回答中提到的mixins的常用方法 - 他们继承的地方object- 在Django世界中并不奏效.
使用提供的示例构建mixins的正确方法是:
class TaggingMixin(models.Model):
tag = models.ForeignKey(Tag)
class Meta:
abstract = True
class MyModel(TaggingMixin):
title = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)
重点是:
model.Model但被配置为抽象类.model.Model,您的实际模型应该没有继承它.如果这样做,这可能会触发一致的方法解析顺序异常.Dan*_*man 16
我建议它继承自object.这样,您可以确保它仅提供您实际明确定义的那些方法和属性.
此外,在定义具体类时,应始终确保将mixin类放在第一位.Python的解析规则意味着在类声明中按照它们的定义顺序搜索超类,并且当找到匹配的属性时,解析停止.因此,如果你的mixin定义了一个也由主超类定义的方法,那么你的mixin方法就找不到了.
| 归档时间: |
|
| 查看次数: |
20305 次 |
| 最近记录: |