我有一个 Python 类,其类属性设置为除None
。创建新实例时,对该属性所做的更改将在所有实例中永久存在。
下面是一些代码来解释这一点:
class Foo(object):
a = []
b = 2
foo = Foo()
foo.a.append('item')
foo.b = 5
Using foo.a
回报['item']
and foo.b
回报5
,正如人们所期望的那样。
当我创建一个新实例时(我们将其称为bar
), 使用bar.a
回报['item']
and bar.b
return 5
, 也!但是,当我最初将所有类属性设置为None
然后将它们设置为__init__
,像这样:
class Foo(object):
a = None
b = None
def __init__(self):
self.a = []
self.b = 2
Using bar.a
回报[]
and bar.b
回报2
while foo.a
回报['item']
and foo.b
回报5
.
是这样吗suppose上班?显然,在我编写 Python 的 3 年里,我从未遇到过这个问题,并且希望得到一些澄清。我在文档中也找不到它,所以如果可能的话给我一个参考就太好了。 :)
是的,这就是它应该如何工作的。
If a
and b
属于instance of Foo
,那么正确的做法是:
class Foo(object):
def __init__(self):
self.a = []
self.b = 2
以下使a
and b
属于类本身,因此所有实例共享相同的变量:
class Foo(object):
a = []
b = 2
当您混合使用这两种方法时(正如您在第二个示例中所做的那样),这不会添加任何有用的内容,只会引起混乱。
值得一提的一个警告是,当您在第一个示例中执行以下操作时:
foo.b = 5
你没有改变Foo.b
,您正在添加一个全新的属性foo
那个“影子”Foo.b
。当你这样做时,既不bar.b
nor Foo.b
改变。如果您随后这样做del foo.b
,这将删除该属性并且foo.b
将再次提及Foo.b
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)