Question

Je suis de créer une classe de vues pour un projet Django et face à une décision de conception concernant les attributs.

De lecture fonctions

J'ai regardé Django générique de points de vue, et vu qu'il y a beaucoup de classes qui fournissent des deux variables de classe ainsi que des fonctions de lecture. e.g.

class FormMixin(object):
    initial = {}
    def get_initial(self):
        return self.initial

Cette décision de conception logique, parce que de cette façon, vous pouvez appeler super() dans une méthode de remplacement d'une extension de la classe.

Propriétés

Dans mon projet, il y a certaines valeurs que j'ai pu substituer parfois à l'aide d'une simple valeur, mais qui, parfois, doivent être générés dnyamically.Au début, j'ai créé des méthodes similaires à celles ci-dessus, mais alors pensé que peut-être les propriétés sont une belle façon de le faire.

class MyBaseView(OtherView):
    counter = None

class MyExtendingView(MyBaseView):
    counter = 5

class MyOtherExtendingView(MyBaseView):
    @property
    def counter(self):
        return self.other_function()

exemple.__dict__

J'ai l'intention sur l'utilisation de ces valeurs à l'intérieur d'un modèle.Je passe les instances de l'extension de vues d'un modèle et d'afficher les attributs de la façon suivante:

context['class_instances'] = [MyExtendingView(), MyOtherExtendingView()]

{% for instance in class_instances %}
    {{ instance.counter|default:'' }}
{% endfor %}

Maintenant que c'est un modèle, et il n'a pas vraiment d'importance si l'instance de l'attribut est une valeur ou une fonction, je pourrais aussi écrire mes classes comme ceci:

class MyExtendingView(MyBaseView):
    counter = 5

class MyOtherExtendingView(MyBaseView):
    def counter(self):
        return self.other_function()

L' def counter pour remplacer l'ancien basée sur la valeur de l'attribut instance.__dict__.

Question

Pour arriver à la question, de la liste l'une des approches est le meilleur choix?

  • Le getter approche est bonne, car elle permet de super()-l'appel de la mère de la fonction get, mais dans mon cas, qui ne sera probablement jamais besoin.
  • La propriété approche est beaucoup plus simple et provoque moins de code à écrire.Je ne peux pas super()-appel d'un parent de la propriété de la fonction si.Je ne vais pas avoir besoin de ce comportement dans la plupart des cas, mais il pourrait y avoir des cas où j'ai besoin de super() fonctionnalité, il y aurait donc un mélange de simples attributs qui peuvent être substituée à l'aide de propriétés et de la coutume de lecture fonctions.
  • La dernière approche est d'autant moins que le code de la propriété approche, mais je doute que c'est un bon style.
Était-ce utile?

La solution

La propriété approche est beaucoup plus simple et provoque moins de code à écrire.Je ne peux pas super()-appel d'un parent de la propriété de la fonction si.

En fait vous pouvez accéder aux propriétés parent via super():

class A(object):
    @property
    def prop(self):
        return 'A.prop'

class B(A):
    @property
    def prop(self):
        return '%s - %s' % (super(B, self).prop, 'B.prop')

>>> b = B()
>>> b.prop
'A.prop - B.prop'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top