为何将Class1对象作为Class2构造函数默认参数时仅初始化一次?
问题:为何创建三个不同的Class2对象时,Class1仅被初始化一次?
代码示例
class Class1: def __init__(self): print('Printing from Class1 init') self.val = 0 def __str__(self): return f'value = {self.val}' class Class2: def __init__(self, val=Class1()): print(f'Printing from Class2 init') print(val) self.count = val print('**********') a = Class2() a.count.val += 1 print(a.count) print('**********') b = Class2() b.count.val += 1 print(b.count) print('**********') c = Class2() c.count.val += 1 print(c.count) print('**********')
运行输出
Printing from Class1 init ********** Printing from Class2 init value = 0 value = 1 ********** Printing from Class2 init value = 1 value = 2 ********** Printing from Class2 init value = 2 value = 3 **********
原因解析
这是Python默认参数的特性导致的——默认参数的表达式是在函数(此处为Class2.__init__)被定义的阶段就执行计算并绑定的,而非每次调用函数时重新生成。
具体到这段代码:
- 当Python解析
class Class2:的定义、处理__init__方法时,就会立即执行Class1()这个默认参数表达式,创建出一个Class1实例,这个实例之后就固定作为val参数的默认值。 - 后续每次调用
Class2()创建对象时,只要你不手动传入val参数,就会直接复用这个提前创建好的Class1实例,不会再触发Class1.__init__,所以Class1只初始化了一次。 - 这也是为什么三次修改
val值会累加的原因——a、b、c三个Class2对象的count属性,指向的都是同一个Class1实例。
解决方法
如果想让每次创建Class2对象时都生成新的Class1实例,可以把默认参数设为None,再在__init__内部动态创建:
class Class2: def __init__(self, val=None): if val is None: val = Class1() print(f'Printing from Class2 init') print(val) self.count = val
内容的提问来源于stack exchange,提问作者Sagar Verma
相关产品推荐
相关产品推荐

