2016-06-04 1 views
-1

Dans l'exemple suivant employee n'est pas utilisé dans la fonction __init__, mais nous l'avons utilisé dans la fonction add_employee appelant self.employee.append(). Pourquoi est-ce? Pourquoi avons-nous utilisé self.employee.append() au lieu de employee.append()? Je pensais que nous utilisons seulement self pour les variables dans la fonction __init__.soi-même »Comprendre les classes

class Workers(): 
    employee = [] 

    def __init__(self, name): 
     self.name = name 
     self.skills = [] 
     self.add_employee() 

    def add_employee(self): 
     self.employee.append(self.name) 
     print('{} added to list'.format(self.name)) 
+0

Essayez 'employee.append()' vous devriez obtenir une NameError sur 'employee' –

+0

@ cricket_007 Je sais, c'est pourquoi j'ai demandé – zou

Répondre

0

L'objet employee est une variable de classe, pas une variable d'instance. Cela signifie qu'il est partagé entre toutes les instances de cette classe. Vous pouvez y accéder avec classname.classvariablename ou instancename.classvariablename. Si vous réaffectez la version d'une instance avec quelque chose comme instancename.classvariablename = newvalue, cette instance aura une nouvelle variable d'instance de ce nom qui masque son accès à la variable de classe avec la référence self (par exemple, vous ne pourrez pas faire instancename.classvariablename pour obtenir la variable de classe), mais d'autres instances - et la classe - seront toujours capables de le faire (c'est-à-dire que classname.classvariable continuera à fonctionner, et otherinstancename.classvariable pointera toujours vers cette variable de classe). L'exemple suivant le démontre.

>>> class A: 
...  l = [] 
... 
>>> a = A() 
>>> b = A() 
>>> a.l 
[] 
>>> A.l 
[] 
>>> a.l = 3 
>>> b.l 
[] 
>>> b.l.append(1) 
>>> b.l 
[1] 
>>> A.l 
[1] 
>>> a.l 
3 
1

employee, __init__ et add_employee sont des attributs de la classe juste Workers.

employee est un attribut étant une liste, et __init__ est un autre attribut, étant une méthode.

également de la [documentation def] ( https://docs.python.org/3/reference/compound_stmts.html#grammar-token-funcdef):

Une définition de fonction est une instruction exécutable. Son exécution lie le nom de la fonction dans l'espace de noms local actuel à un objet fonction (un wrapper autour du code exécutable de la fonction).

si employees et __init__ et toutes les autres méthodes sont vraiment les mêmes: noms dans un namespaces.

Voir aussi https://docs.python.org/3/tutorial/classes.html#class-objects