2016-06-04 3 views
-1

В следующем примере employee не используется в функции __init__, но мы использовали его в функции add_employee, вызывающей self.employee.append(). Почему? Почему мы использовали self.employee.append() вместо employee.append()? Я думал, что мы используем только self для переменных в функции __init__.Понимание классов 'self'

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

Попробуйте 'employee.append()' вы должны получить NameError на 'employee' –

+0

@ cricket_007 я знаю, поэтому я спросил – zou

ответ

0

Объект employee является переменной класса, а не переменная экземпляра. Это означает, что он используется для всех экземпляров этого класса. Вы можете получить к нему доступ с помощью classname.classvariablename или instancename.classvariablename. Если вы переназначите версию экземпляра с чем-то вроде instancename.classvariablename = newvalue, у этого экземпляра будет новая переменная экземпляра этого имени, которая маскирует свой доступ к переменной класса с помощью ссылки self (т. Е. Вы не сможете сделать instancename.classvariablename, чтобы получить переменная класса), но другие экземпляры - и класс - все равно смогут (то есть classname.classvariable все равно будет работать, а otherinstancename.classvariable все равно укажет на эту переменную класса). Следующий пример демонстрирует это.

>>> 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__ и add_employee только атрибуты класса Workers.

employee - это атрибут, являющийся списком, а __init__ - еще один атрибут, являющийся методом.

Кроме того, из [документации четкости] ( https://docs.python.org/3/reference/compound_stmts.html#grammar-token-funcdef):

Определение функции является исполняемым оператором. Его выполнение связывает имя функции в текущем локальном пространстве имен с объектом функции (оболочкой вокруг исполняемого кода для функции).

employees так и __init__ и все другие методы на самом деле же: имена в пространствах имен.

Смотрите также https://docs.python.org/3/tutorial/classes.html#class-objects

Смежные вопросы