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

Python:对象传入构造函数后是否保持一致?附代码问题排查

问题分析与解决方案

先明确回答你最初的疑问:Python中对象传入构造函数后确实是同一个对象——Python采用“按对象引用传递”的机制,bar实例里的self.my_foo和你在main中创建的my_foo指向的是同一个内存对象。你遇到的输出为空问题,完全是代码里的语法/逻辑错误导致的,和对象引用无关。

下面拆解具体问题:

1. 错误的方法调用方式

你在main里写了:

my_foo.set_var1 = 'Hello'

这行代码不是调用set_var1方法,而是把my_foo实例的set_var1方法直接替换成了字符串'Hello'!正确的方法调用应该是加括号并传入参数:

my_foo.set_var1('Hello')

2. call_var1方法里的实例使用错误

在bar类的call_var1方法中,你写了:

print('var1:'+ foo(self.my_foo).var1)

这里犯了两个错误:

  • 你的foo类构造函数__init__没有定义参数,用foo(self.my_foo)创建新实例会直接触发参数不匹配的报错
  • 完全没必要创建新的foo实例!self.my_foo已经是你传入的那个foo对象,直接访问它的var1属性即可。

修正后的call_var1方法应该是:

def call_var1(self):
    print('var1:' + self.my_foo.var1)

修正后的完整代码

class foo:
    def __init__(self):
        pass
    var1 = ''
    def set_var1(self, value):
        self.var1 = value

class bar:
    def __init__(self, foo):
        self.my_foo = foo
    my_foo = None
    def call_var1(self):
        print('var1:' + self.my_foo.var1)  # 直接使用传入的foo实例

if __name__ == '__main__':
    my_foo = foo()
    my_foo.set_var1('Hello')  # 正确调用方法赋值
    my_bar = bar(my_foo)
    my_bar.call_var1()

运行这段代码后,输出就会是var1:Hello,符合你的预期。

内容的提问来源于stack exchange,提问作者Jieke Wei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:58:18