Dies ist eine Frage zu Python-Mixins, die im Allgemeinen nützlich sein kann. Ich verwende nur Django-Modelle, da dies der Anwendungsfall ist, mit dem ich am besten vertraut bin.
Sollte ein Mixin von der Klasse erben, die mit oder von 'object' gemischt werden soll?
Beispiele nach Code, was ist korrekter oder besser oder besser, je nachdem, was Sie erreichen möchten?
Dies
class TaggingMixin(models.Model):
tag = models.ForeignKey(Tag)
class Meta:
abstract = True
class MyModel(models.Model, TaggingMixin):
title = models.CharField(max_length=100)
Oder dieses:
class TaggingMixin(object):
tag = models.ForeignKey(Tag)
class Meta:
abstract = True
class MyModel(models.Model, TaggingMixin):
title = models.CharField(max_length=100)
Ich denke, das Erben von Objekten ist der richtige Weg. Aber ich sehe Beispiele für den ersten Fall im ganzen Netz ...
EDIT: Ich habe meine Folgefrage auf eine separate Frage verschoben: Django Abstract Models gegen einfache Python-Mixins gegen Python ABCs
TypeError: Cannot create a consistent method resolution order (MRO)
. Tun Sieclass MyModel(TaggingMixin):
stattdessen. Siehe stackoverflow.com/q/29214888/1627479models.Model
oder anderen abstrakten Modellen "mischen"Ich würde empfehlen, dass es von erbt
object
. Auf diese Weise können Sie sicherstellen, dass nur die Methoden und Attribute bereitgestellt werden, die Sie tatsächlich explizit definieren.Außerdem sollten Sie immer sicherstellen, dass Sie die Mixin-Klasse an die erste Stelle setzen, wenn Sie Ihre konkrete Klasse definieren. Die Auflösungsregeln von Python bedeuten, dass die Oberklassen in der Reihenfolge ihrer Definition in der Klassendeklaration durchsucht werden und die Auflösung stoppt, wenn ein übereinstimmendes Attribut gefunden wird. Wenn Ihr Mixin eine Methode definiert, die auch von der Haupt-Superklasse definiert wird, wird Ihre Mixin-Methode nicht gefunden.
quelle
models.Model
(oder genauer gesagt nicht über das__metaclass__
erforderliche verfügt).Dies sieht aus wie ein Job für ein abstraktes Modell .
BEARBEITEN:
Das sind keine Mixins an sich. Oder besser gesagt, sie müssen es nicht sein. Sie können direkt von einem abstrakten Modell ableiten.
quelle
Wenn Sie von einem einfachen Python-Objekt erben, erstellt South keine Migration, sodass Sie diesen Ansatz nicht verwenden können
quelle