在下面的示例中,employee
未在 __init__
函数中使用,但我们在调用 self.employee.append()
的 add_employee
函数中使用它。为什么?为什么我们使用self.employee.append()
而不是employee.append()
?我以为我们只对__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))
employee
、__init__
和add_employee
只是类Workers
的属性。
employee
属性是列表,__init__
是另一个属性,是方法。
同样来自 [def 文档](https://docs.python.org/3/reference/compound_stmts.html#grammar-token-funcdef):
函数定义是一个可执行语句。它的执行将当前本地命名空间中的函数名称绑定到函数对象(函数可执行代码的包装器)。
所以employees
和__init__
以及所有其他方法实际上是相同的:命名空间中的名称。
参见https://docs.python.org/3/tutorial/classes.html#class-objects
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