了解类'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只是类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.classvariablenameinstancename.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

最新更新