如何在Python中创建类的不同实例?

How to create distinct instances of a class in Python?

本问题已经有最佳答案,请猛点这里访问。

有人能给我解释一下下面的代码吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class InnerTest:

    def __init__(self, value = 0):
        self.value = value

class OuterTest:

    def __init__(self, inner_test = InnerTest()):
        self.inner_test = inner_test

a = OuterTest()
b = OuterTest()

a.inner_test.value = 42
print b.inner_test.value

它印42张,我想是0。

我打算创建两个outertest实例,每个outertest都包含一个不同的innertest实例。相反,我得到了两个outertest实例,它们引用了同一个innertest实例。

还有什么是实现我想要的东西的正确方法?


函数定义时,函数中的默认参数只计算一次。因此,两个对象都只使用了一个InnerTest实例。

这意味着,当您创建这两个对象时:

1
2
a = OuterTest()
b = OuterTest()

a.inner_testb.inner_test都指的是同一个实例,因此结果也是如此。

要解决此问题,请将默认值更改为None,并有条件地创建实例:

1
2
3
4
5
class OuterTest:
    def __init__(self, inner_test=None):
        if not inner_test:
            inner_test = InnerTest()
        self.inner_test = inner_test


您可以将InnerTest()移动到in it中,或者在init中调用它,在第二种情况下传递对n类的引用。

使用def __init__(self, inner_test = InnerTest()):进行一次评估,以便在OuterTest类的所有实例之间共享对象,使其成为类属性,而不是在in it中实例化实例属性。

1
2
3
class OuterTest:
    def __init__(self):
        self.inner_test = InnerTest()

或:

1
2
3
class OuterTest:
    def __init__(self, inner_test = InnerTest):
        self.inner_test = inner_test()

这两种方法都将按需要工作,传递对类的引用意味着您可以选择传递您想要的任何类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
In [11]: class OuterTest:
   ....:     def __init__(self, inner_test=InnerTest):
   ....:             self.inner_test = inner_test()
   ....:        

In [12]: a = OuterTest()

In [13]: b = OuterTest()

In [14]: a.inner_test.value = 42

In [15]: print(a.inner_test.value)
42

In [16]: print(b.inner_test.value)
0

In [17]: class OuterTest:
   ....:     def __init__(self):
   ....:             self.inner_test = InnerTest()
   ....:        

In [18]: a = OuterTest()

In [19]: b = OuterTest()

In [20]: a.inner_test.value = 42

In [21]: print(a.inner_test.value)
42

In [22]: print(b.inner_test.value)