理解 类 'self'

Understanding classes 'self'

在下面的例子中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 只是 class Workers.

的属性

employee是一个属性,是一个列表,__init__是另一个属性,是一个方法。

同样来自[def文档]( https://docs.python.org/3/reference/compound_stmts.html#grammar-token-funcdef):

A function definition is an executable statement. Its execution binds the function name in the current local namespace to a function object (a wrapper around the executable code for the function).

所以 employees__init__ 以及所有其他方法实际上是相同的:命名空间中的名称。

另请参阅 https://docs.python.org/3/tutorial/classes.html#class-objects

employee对象是一个class变量,不是实例变量。这意味着它在 class 的所有实例之间共享。您可以使用 classname.classvariablenameinstancename.classvariablename 访问它。如果你用 instancename.classvariablename = newvalue 之类的东西重新分配一个实例的版本,该实例将有一个同名的新实例变量,用 self 引用(即,您将无法执行 instancename.classvariablename 来获取 class 变量),但其他实例 - 和 class - 仍然能够(即 classname.classvariable仍然有效,并且 otherinstancename.classvariable 仍将指向那个 class 变量)。以下示例演示了这一点。

>>> 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