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

时间:2015-12-15 16:02:06

标签: python class oop instance

请有人向我解释以下代码。

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实例,每个实例都包含一个不同的InnerTest实例。相反,我得到了两个引用同一个InnerTest实例的OuterTest实例。

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

2 个答案:

答案 0 :(得分:10)

函数中的默认参数仅在函数定义时计算一次。因此,只有一个InnerTest实例用于该对象。

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

a = OuterTest()
b = OuterTest()

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

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

class OuterTest:
    def __init__(self, inner_test=None):
        if not inner_test:
            inner_test = InnerTest()
        self.inner_test = inner_test

答案 1 :(得分:2)

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

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

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

或者:

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

两种方法都可以按预期工作,将引用传递给类意味着你可以选择传入你想要的任何类:

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)