8
votes

Utilisation de la variable de classe comme argument non par défaut dans Python

existe-t-il un moyen de conserver une variable de classe privée au sein de la classe et d'utiliser toujours la valeur par défaut à une variable non par défaut (sans définir cette valeur avant, en dehors de la classe)?

Exemple: xxx


2 commentaires

Python fait pas avoir des variables de classe privée. Du tout. Le double sous-traitant que vous utilisez est pas Faire la variable privée, elle s'appelle juste mangling pour éviter les affrontements de nom. N'utilisez pas de doubles soulignes à moins que vous sachiez pourquoi vous devez. ;)


Grande question! (Eh bien, cela a résolu un problème énorme que j'avais, alors ...)


3 Réponses :


14
votes

Vous avez omnuent le problème:

class a:

    def __init__(self):
        self.__variable = 6

    def b(self, value=None):
        if value is None:
            value = self.__variable
        print value


0 commentaires

4
votes
  1. auto .__ variable est une variable d'instance, pas une variable de classe.
  2. Parce que les arguments par défaut sont évalués à Fonction la fonction de définition de la méthode, vous ne pouvez pas utiliser une variable d'instance comme argument par défaut - au moins pas directement (le tour habituel, défaut de Aucun et ajout si arg est Aucun: arg = real_default au corps de la fonction, fonctionne).
  3. Double souligné de dirigeants ne signifie pas "privé", ils signifient "Nom Mangling et demandant des ennuis". Si vous ne savez pas exactement ce que je veux dire, vous ne devriez pas utiliser cette "fonctionnalité" du tout. L'utilisation prévue est non membres privés - utilisez un soulignement pour cela.

5 commentaires

Quoi, alors est l'utilisation prévue?


@Karl: Prévenir les affrontements de nom dans les sous-classes. Voir par exemple Docs.python.org/reference/... ou Docs.python.org/Tutorial/... ( troisième paragraphe).


Je peux toujours accéder aux variables si j'utilise seulement 1 sous-côtite


@CALCCRYPTO: Oui, bien sûr. Pourquoi pas? En réalité, l'inverse est vrai: vous ne pouvez pas - sanel - accès __ variable n'importe où en dehors de la définition de la classe (due au nom de Mangling). C'est pourquoi je vous suggère fortement de laisser tomber un soulignement.


@calccrypto Oui, ça va. Python est construit sur l'hypothèse que nous sommes tous des adultes qui comprennent que l'accès à une autre variables de classe, sans autorisation explicite (de la documentation de cette classe '), est coquine. (Et même alors, au lieu d'accorder une autorisation, nous avons maintenant des wrappers de propriété maintenant.) Si je voulais ce niveau de vérification du temps compilé, je n'utiliserais pas une langue dactylographiée.



4
votes

On vaut la peine d'ajouter à cela que vous pouvez créer une valeur sennelle personnalisée qui ne s'habitue à aucun autre but dans votre code si vous voulez Aucun dans la gamme d'arguments admissibles. Sans cela, valeur , Aucun ne peut jamais être retourné à partir de B . xxx

maintenant Aucun peut être transmis à B sans que la valeur par défaut soit utilisée "


0 commentaires