一个是类属性,而另一个是实例属性。它们是不同的,但是它们之间的紧密联系使它们有时看起来相同。
它与python查找属性的方式有关。有一个层次结构。在简单的情况下,可能看起来像这样:
instance -> Subclass -> Superclass -> object (built-in type)
当您寻找这样的属性时
instance…
`instance.val`
…实际发生的是, 首先
,Python
val在实例本身中进行查找。然后,如果找不到
val,它将在其类中查找
Subclass。然后,如果它没有找到
val那里,它看起来的父母
Subclass,
Superclass。这意味着当您这样做时…
>>> class Foo(): foovar = 10 def __init__(self, val): self.selfvar = val
…所有
Fooshare 实例
foovar,但有各自不同
selfvar的。这是一个简单的具体示例:
>>> f = Foo(5)>>> f.foovar10>>> Foo.foovar10
如果我们不碰
foovar,则
f和都相同
Foo。但是,如果我们改变
f.foovar…
>>> f.foovar = 5>>> f.foovar5>>> Foo.foovar10
…我们添加了一个有效遮罩的值的实例属性
Foo.foovar。现在,如果我们
Foo.foovar直接进行更改,则不会影响我们的
foo实例:
>>> Foo.foovar = 7>>> f.foovar5
但这确实会影响一个新
foo实例:
>>> Foo(5).foovar7
还请记住,可变对象增加了另一层间接寻址(正如mgilson提醒我的那样)。在这里,与
f.foovar指代相同的对象
Foo.foovar,因此当您更改对象时,更改将沿层次结构传播:
>>> Foo.foovar = [1]>>> f = Foo(5)>>> f.foovar[0] = 99>>> Foo.foovar[99]



