Python 类构造函数能够使用同一类对象的实例初始化

Python 类构造函数能够使用同一类对象的实例初始化,python,class,init,self,Python,Class,Init,Self,python能否创建一个可以用同一类对象的实例初始化的类 我试过这个: class Class(): def __init__(self,**kwargs): print self self = kwargs.get('obj',self) print self if not hasattr(self,'attr1'): print 'attr1' self.att

python能否创建一个可以用同一类对象的实例初始化的类

我试过这个:

class Class(): 

    def __init__(self,**kwargs):

        print self

        self = kwargs.get('obj',self)

        print self

        if not hasattr(self,'attr1'):
            print 'attr1'
            self.attr1  = kwargs.pop('attr1',[])
        if not hasattr(self,'attr2'):
            print 'attr2'
            self.attr2 = kwargs.pop('attr2',[])

        print self

        self.attr1 = kwargs.pop('attr1',self.attr1)
        self.attr2 = kwargs.pop('attr2',self.attr2)
        print self.attr1
        print self.attr2
如果我创建一个新实例,则没有问题:

inst = Class(attr1=[1,2,3])
print inst
print inst.attr1,inst.attr2
输出为:

<__main__.Class instance at 0x7f2025834cf8>  
<__main__.Class instance at 0x7f2025834cf8>  
attr1  
attr2  
<__main__.Class instance at 0x7f2025834cf8>  
[1, 2, 3]  
[]  
<__main__.Class instance at 0x7f2025834cf8>  
[1, 2, 3]  []
<__main__.Class instance at 0x7f202584b7e8>  
<__main__.Class instance at 0x7f2025835830>  
<__main__.Class instance at 0x7f2025835830>  
[1, 2, 3]  
[]  
 <__main__.Class instance at 0x7f202584b7e8>  
输出为:

<__main__.Class instance at 0x7f2025834cf8>  
<__main__.Class instance at 0x7f2025834cf8>  
attr1  
attr2  
<__main__.Class instance at 0x7f2025834cf8>  
[1, 2, 3]  
[]  
<__main__.Class instance at 0x7f2025834cf8>  
[1, 2, 3]  []
<__main__.Class instance at 0x7f202584b7e8>  
<__main__.Class instance at 0x7f2025835830>  
<__main__.Class instance at 0x7f2025835830>  
[1, 2, 3]  
[]  
 <__main__.Class instance at 0x7f202584b7e8>  
我处理了这个问题,但不知道如何解决:

在第一种情况下,实例地址在类内外总是相同的 在第二种情况下:

课堂内: init调用在新地址创建一个新实例 然后将self设置为上一个实例并更改地址:OK self已经具有属性attr1和atr2:确定

但在课堂之外:

inst2具有来自init的地址,并且没有属性! 怎么了?在Python中,地址矫揉造作是如何工作的?
这是一种很好的方式吗?

不确定您想要实现什么,但从技术上讲,您的错误在这里:

    self = kwargs.get('object',self)
self没有什么神奇之处,它只是一个函数参数,作为一个局部变量,因此在函数中重新绑定它只会使局部名称self指向函数范围内的另一个对象。它绝不会影响当前实例——方法包装器传递给_uinit的实例,它只是使self成为对象的别名

如果要将属性从对象复制到自身,则必须明确执行以下操作:

 other = kwargs.get('object')
 if other is not None:
     self.attrx = other.attrx
     self.attry = other.attry
     # etc
哦,是的:Python是一种高级语言,没有什么比地址矫揉造作更好的了——您所拥有的只是引用对象的名称,实际上,名称=>对象映射。名称只是一个名称,对象的实际位置与您无关

由于以上评论,我理解了两件事:


self只是一个局部变量,而不是类实例 _init_uu是一个类内置方法,用于从其他对象初始化实例 因此,如果我想从现有实例初始化一个新的类实例,我只需要创建一个初始化器方法,该方法调用

然后像这样使用它:

inst = Class(attr1=[1,2,3])
print inst
print inst.attr1,inst.attr2
输出:

<__main__.Class instance at 0x7eff842d5368>
[1, 2, 3] []
输出:

<__main__.Class instance at 0x7eff842d56c8>
[1, 2, 3] [12, 11]

什么你到底想达到什么目的?!想象一下,如果你能让它工作。语法是什么样子的?您将如何向其他人解释如何使用您的代码?否决票是匿名的,不需要评论,请参见例如。更不用说你有评论了!如果你不能说得更清楚,那就别指望得到答案。你到底想做什么?通过_uinit__;实现一个奇怪的复制方法?为什么?什么是地址伪装?您不必使用继承,我的观点是,在Python中实现替代构造函数的规范方法是使用@classmethod。这感觉像是在和墙争论,所以我不会进一步评论。所以,如果我理解得很好,就把它称为局部变量,它是方法包装器传递给init的当前实例的别名?如果我重新绑定它,我会丢失init范围内的当前实例@bruno\desthuiliersThanks@brunodesthuilliersself只是一个局部变量,而不是类实例:self是函数作用域中的一个名称,该名称最初指的是调用该方法的当前实例。
inst2 = inst.Class(attr2=[12,11])
print inst2
print inst2.attr1,inst2.attr2
<__main__.Class instance at 0x7eff842d56c8>
[1, 2, 3] [12, 11]