我有一个关于 Python 类和变量的小问题。
为什么在第一个示例中“self”关键字“破坏”了计数器变量的工作,而在第二个示例中(在机制方面与第一个示例非常相似)“self”关键字在以下方面没有做任何“错误”的事情结果:
# Counter does not work properly (incrementation) if 'self' keyword is provided before the variable named 'counter'.
# Instead of 'self' keyword we shall use class name, to make this work 'ExampleOne.counter += 1'.
class ExampleOne:
counter = 0
def __init__(self, name, surname):
self.name = name
self.surname = surname
self.counter += 1
# It works, meaning list is being updated. Even if 'self' keyword is provided before variable named 'list'.
class ExampleTwo:
list = []
def __init__(self, name, surname):
self.name = name
self.surname = surname
self.list.append([self.name, self.surname])
self.counter
,当查找一个值时,会检查实例后面的类;但是当分配一个值时,只会分配给实例(因为它首先尝试实例并且会成功 - 没有什么可以阻止它工作)。
self.counter += 1
相当于self.counter = self.counter + 1
;基于类属性新计算的值被分配为实例属性。
self.list.append(...)
调用查找到的列表对象上的方法;该对象的身份永远不会改变,并且没有分配。因此,每次访问 self.list
都会找到类属性,因为 永远不会先找到任何实例属性。
有关更多技术细节,您可以参见例如Python 属性查找过程如何工作? .
您可能想知道为什么允许查找首先通过实例查找类属性。原因是它有时对多态有用;根据实例的子类型,可以在不同的类中找到类属性。