affectation de variable de classe comme valeur par défaut pour la méthode de classe argument
Je voudrais construire une méthode à l'intérieur d'une classe avec les valeurs par défaut des arguments tirés de cette classe. En général, je ne le filtrage des données. À l'intérieur de ma classe j'ai une méthode où, normalement, je passe vecteur de données. Parfois, je n'ai pas le vecteur, et je profite de données simulées. Chaque fois que je ne passe pas un particulier vecteur je voudrais profiter de l'aide de données simulées par défaut. J'ai pensé qu'il devrait être facile de la construction où à l'intérieur de ma définition de la méthode, je dis a=self.vector
. Mais pour une raison que j'ai une erreur NameError: name 'self' is not defined
. La simplification de la construction est:
class baseClass(object): # This class takes an initial data or simulation
def __init__(self):
self.x = 1
self.y = 2
class extendedClass(baseClass): # This class does some filtering
def __init__(self):
baseClass.__init__(self)
self.z = 5
def doSomething(self, a=self.z):
self.z = 3
self.b = a
if __name__ == '__main__':
a = extendedClass()
print a.__dict__
a.doSomething()
print a.__dict__
Une sortie que j'attendais devrait être:
{'y': 2, 'x': 1, 'z': 5}
{'y': 2, 'x': 1, 'z': 3, 'b': 5}
J'ai essayé de l'affectation par défaut comme def doSomething(self, a=z):
évidemment, il ne fonctionne pas toujours. Autant je comprends self.z
est visible dans ce champ d'application et ne devrait pas être un problème pour l'avoir comme valeur par défaut. Je ne sais pas pourquoi j'ai cette erreur et comment le faire. C'est probablement une question facile, mais j'essaie de le comprendre ou de trouver la solution sans manque quelque temps déjà. J'ai trouvé similaire questions seulement pour les autres langues.
Vous devez vous connecter pour publier un commentaire.
Votre compréhension est erronée.
self
est lui-même un paramètre à cette définition de fonction, donc il n'y a aucun moyen on peut être portée à ce point. C'est uniquement dans la portée au sein de la fonction elle-même.La réponse est tout simplement par défaut de l'argument de
None
, puis vérifiez que l'intérieur de la méthode:if a: a = self.z
ou mêmea = a or self.z
.if not a: a = self.z
extendedClass
init constructeur d'inclure une option dez=None
de la propriété, et siNone
affectez-lui une valeur par défaut à l'intérieur de la méthode, et n'ayant pas comme un paramètre de méthode? Je ne peux que penser que le fait d'avoir codé en dur propriété de classe est utile si c'est vraiment une constante, et requis par plus d'une méthode, sinon pourquoi ne pas restreindrez
à la portée de la méthode, peut-être avec aucune classe ou une propriété d'objet à tous?Voici le désassemblage du code pour un exemple simple module. Un code objet est en lecture seule contenant pour bytecode, les constantes et les noms qu'elle utilise et les métadonnées sur le nombre de variables locales, requis la taille de la pile, etc. Notez que tous les code les objets sont compilés sous forme de constantes. Celles-ci sont créées au moment de la compilation. Mais les objets
class A
etfunction test
sont instanciés au moment de l'exécution (par exemple, lorsque le module est importé).Pour faire la classe,
BUILD_CLASS
prend le nom'A'
, les basestuple
(object,)
, et undict
qui contient les attributs de la classe de l'espace de noms. C'est comme manuellement l'instanciation d'un type en appelanttype(name, bases, dict)
. Pour faire de ladict
, une fonction est créé à partir du code objetA
et appelé. Enfin, la classe de l'objet est stocké dans le module de l'espace de noms parSTORE_NAME
.Dans le code de l'objet
A
,self.z
est chargé sur la pile comme argument deMAKE_FUNCTION
. Le pseudo-code de l'opLOAD_NAME
rechercheself
dans le courant des locaux (c'est à dire la classe de l'espace de noms en cours de définition), le module globales, et les builtins. Ce sera évidemment pas siself
n'est pas défini dans le global ou les builtins portée; il n'est pas défini dans la portée locale.Si elle a réussi, cependant, la fonction est créée avec
(self.z,)
comme son__defaults__
attribut, et ensuite stocké pour le nom localtest
.@uselpa: Votre pastebin exemple (réécrit pour 2.x):
Comme vous pouvez le voir, la classe de l'objet
Cl
(et la fonction de l'objet__init__
) est instancié et stockées pour le nom local'Cl'
une fois. Le module exécute séquentiellement au moment de l'exécution, de sorte que par la suite reconsolidation du nomdefault
n'aura aucun effet sur la valeur par défaut dans__init__
.Vous pourriez instancier dynamiquement une nouvelle fonction à l'aide de la déjà le code compilé et une nouvelle valeur par défaut:
Ce réutilise le déjà compilé en code objet de
__init__.__code__
pour créer une fonction avec un nouveau__defaults__
tuple:Des arguments par défaut évaluée qu'une seule fois, lorsque la définition est exécutée. Au lieu de cela, faire cela:
Voir aussi http://docs.python.org/release/3.3.0/tutorial/controlflow.html#more-on-defining-functions.
Cela permettra d'insérer
self.z
sia
estNone
/False
/empty_value
: