代码之家  ›  专栏  ›  技术社区  ›  zou

了解类的“自我”[重复]

  •  -1
  • zou  · 技术社区  · 8 年前

    在以下示例中 employee 不用于 __init__ 函数,但我们在 add_employee 函数调用 self.employee.append() . 这是为什么?我们为什么使用 self.employee.append() 而不是 employee.append() ? 我以为我们只使用 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))
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Julien Palard    8 年前

    employee , __init__ add_employee 只是类的属性 Workers .

    受雇者 属性是列表,并且 __初始化__ 是另一个属性,是一个方法。

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

    函数定义是一个可执行语句。它的执行将当前本地命名空间中的函数名绑定到函数对象(函数的可执行代码的包装器)。

    所以 employees __初始化__ 所有其他方法实际上都是相同的:名称空间中的名称。

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

        2
  •  0
  •   TigerhawkT3    8 年前

    这个 employee 对象是类变量,而不是实例变量。这意味着它在该类的所有实例中共享。您可以使用访问它 classname.classvariablename instancename.classvariablename 。如果使用以下内容重新分配实例的版本 instancename.classvariablename = newvalue ,该实例将有一个同名的新实例变量,该变量用 self 参考(即,您将无法 实例名称.类变量名称 但其他实例和类仍然能够(即。, 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