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: p>
3 Réponses :
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
auto .__ variable code> est une variable d'instance, pas une variable de classe. li>
- Parce que les arguments par défaut sont évalués à
Fonction del> 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 code> et ajout si arg est Aucun: arg = real_default code> au corps de la fonction, fonctionne). LI>
- 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 forte> membres privés - utilisez un soulignement pour cela. LI>
ol>
Quoi, alors est B> 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 code> 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é code> maintenant.) Si je voulais ce niveau de vérification du temps compilé, je n'utiliserais pas une langue dactylographiée.
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 maintenant Aucun code> dans la gamme d'arguments admissibles. Sans cela,
valeur code>,
Aucun code> ne peut jamais être retourné à partir de
B code>.
Aucun code> peut être transmis à
B code> sans que la valeur par défaut soit utilisée " p> p>
Python fait pas b> avoir des variables de classe privée. Du tout. Le double sous-traitant que vous utilisez est pas b> 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 ...)