You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:20:37