gpt4 book ai didi

python - 具有非 None 类属性的类的新实例?

转载 作者:太空狗 更新时间:2023-10-30 02:05:54 25 4
gpt4 key购买 nike

我有一个 Python 类,它的类属性设置为 None 以外的值。创建新实例时,对该属性所做的更改会在所有实例中永久生效。

这里有一些代码可以理解这一点:

 class Foo(object):
a = []
b = 2

foo = Foo()
foo.a.append('item')
foo.b = 5

使用 foo.a 返回 ['item']foo.b 返回 5,作为一个会期待。

当我创建一个新实例(我们称它为 bar)时,使用 bar.a 返回 ['item'] 并且bar.b 也返回 5!但是,当我最初将所有类属性设置为 None 然后将它们设置为 __init__ 中的任何内容时,如下所示:

 class Foo(object):
a = None
b = None

def __init__(self):
self.a = []
self.b = 2

使用 bar.a 返回 []bar.b 返回 2foo. a 返回 ['item']foo.b 返回 5

这就是它假设的工作方式吗?在我编写 Python 程序的 3 年里,我显然从未遇到过这个问题,并希望得到一些澄清。我也无法在文档中的任何地方找到它,所以如果可能的话给我一个引用会很棒。 :)

最佳答案

是的,这就是它应该的工作方式。

如果ab 属于Foo实例,那么正确的做法是:

class Foo(object):
def __init__(self):
self.a = []
self.b = 2

以下使得ab 属于类本身,因此所有实例共享相同的变量:

class Foo(object):
a = []
b = 2

当您混合使用这两种方法时 - 正如您在第二个示例中所做的那样 - 这不会添加任何有用的东西,只会造成混淆。

值得一提的是,当您在第一个示例中执行以下操作时:

foo.b = 5

您没有更改 Foo.b,您正在向 foo 添加一个全新的属性,“遮蔽”Foo.b。当您这样做时,bar.bFoo.b 都不会改变。如果您随后执行 del foo.b,则会删除该属性,并且 foo.b 将再次引用 Foo.b

关于python - 具有非 None 类属性的类的新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7903845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com