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
相关产品推荐
相关产品推荐

