Python中将self赋值为其他类实例为何无法生效?
为什么
self = inst无法生效? 在Python里,__init__方法的self只是个局部参数——它一开始指向刚创建的B类实例,但你执行self = inst时,仅仅是把这个局部变量的指向改成了传入的A实例,完全不会影响外部b = B(inst)里b所指向的那个原始B实例。
要明确:__init__的作用是初始化已经创建好的实例,它不负责生成或返回实例对象。真正创建实例的是__new__方法,所以你在__init__里修改self的指向,只是临时改变了局部变量的指向,函数执行完毕后就失效了,外部的b还是那个空的B实例,自然找不到variable1属性。
你看到打印出A的属性,只是因为当时self这个局部变量临时指向了A实例而已,和最终的b对象没有关联。
替代解决方案
既然继承无法适配你的方法和构造函数,推荐两种实用方案:
方案1:组合模式(优先推荐)
把A的实例作为B的一个内部属性存储,还可以通过__getattr__实现自动代理,让你直接通过B实例访问A的属性,不用每次写前缀。
class A: def __init__(self): self.variable1 = 1 self.variable2 = 'sometext' class B: def __init__(self, inst): self._a_inst = inst # 将A实例存为B的内部属性 # 当访问B没有的属性时,自动去A实例中查找 def __getattr__(self, attr_name): return getattr(self._a_inst, attr_name) # 使用示例 a_inst = A() b = B(a_inst) print(b.variable1) # 直接输出1 print(b.variable2) # 直接输出'sometext'
这种方式既保留了B自身的特性,又能便捷访问A的所有变量,灵活性最高。
方案2:重写__new__返回A实例(谨慎使用)
如果你的需求是让B的实例直接等同于A实例,可以重写__new__方法——因为__new__才是真正创建并返回实例的方法。
class A: def __init__(self): self.variable1 = 1 self.variable2 = 'sometext' class B: def __new__(cls, inst): return inst # 直接返回传入的A实例 # 使用示例 a_inst = A() b = B(a_inst) print(b.variable1) # 输出1 print(type(b)) # 注意:此时b的类型是A,不是B
这种方式的局限性是,最终的b本质上还是A实例,B类只是个“包装壳”,如果需要B保留自己的方法和属性,这个方案就不适用。
内容的提问来源于stack exchange,提问作者Anatoole
相关产品推荐
相关产品推荐

