如何在 Python 中创建 class 的不同实例?
How to create distinct instances of a class in Python?
谁能给我解释一下下面的代码。
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 实例。相反,我得到了两个 OuterTest 实例,它们引用了相同的 InnerTest 实例。
另外,实现我想要的东西的正确方法是什么?
您可以将 InnerTest()
移动到 init 中或在 init 中调用它,在第二种情况下传递对 class 的引用。
Using def __init__(self, inner_test = InnerTest()):
被评估一次,因此对象在 OuterTest
class 的所有实例之间共享,使其成为 class attribute 而不是实例化的实例属性它在初始化中。
class OuterTest:
def __init__(self):
self.inner_test = InnerTest()
或者:
class OuterTest:
def __init__(self, inner_test = InnerTest):
self.inner_test = inner_test()
这两种方法都可以按需要工作,传递对 class 的引用意味着您可以选择传递任何您想要的 class:
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)
函数中的默认参数仅在函数定义时计算一次。因此只有一个 InnerTest
实例被用于两个对象。
这意味着,当您创建两个对象时:
a = OuterTest()
b = OuterTest()
a.inner_test
和 b.inner_test
都指的是同一个实例,因此是结果。
为了解决这个问题,将默认值更改为None
,并有条件地创建实例:
class OuterTest:
def __init__(self, inner_test=None):
if not inner_test:
inner_test = InnerTest()
self.inner_test = inner_test
谁能给我解释一下下面的代码。
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 实例。相反,我得到了两个 OuterTest 实例,它们引用了相同的 InnerTest 实例。
另外,实现我想要的东西的正确方法是什么?
您可以将 InnerTest()
移动到 init 中或在 init 中调用它,在第二种情况下传递对 class 的引用。
Using def __init__(self, inner_test = InnerTest()):
被评估一次,因此对象在 OuterTest
class 的所有实例之间共享,使其成为 class attribute 而不是实例化的实例属性它在初始化中。
class OuterTest:
def __init__(self):
self.inner_test = InnerTest()
或者:
class OuterTest:
def __init__(self, inner_test = InnerTest):
self.inner_test = inner_test()
这两种方法都可以按需要工作,传递对 class 的引用意味着您可以选择传递任何您想要的 class:
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)
函数中的默认参数仅在函数定义时计算一次。因此只有一个 InnerTest
实例被用于两个对象。
这意味着,当您创建两个对象时:
a = OuterTest()
b = OuterTest()
a.inner_test
和 b.inner_test
都指的是同一个实例,因此是结果。
为了解决这个问题,将默认值更改为None
,并有条件地创建实例:
class OuterTest:
def __init__(self, inner_test=None):
if not inner_test:
inner_test = InnerTest()
self.inner_test = inner_test