【发布时间】:2015-10-14 14:21:52
【问题描述】:
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] []
但是如果我用实例inst创建一个新实例:
inst2 = Class(obj=inst)
print inst2
print inst2.attr1,inst2.attr2
输出是:
<__main__.Class instance at 0x7f202584b7e8>
<__main__.Class instance at 0x7f2025835830>
<__main__.Class instance at 0x7f2025835830>
[1, 2, 3]
[]
<__main__.Class instance at 0x7f202584b7e8>
AttributeError Traceback (most recent call last)
<ipython-input-228-29c9869a9f4d> in <module>()
1 inst2 = Class(obj=inst)
2 print inst2
----> 3 print inst2.attr1,inst2.attr2
AttributeError: Class instance has no attribute 'attr1'
我处理了这个问题,但我不知道如何解决它:
- 在第一种情况下,实例地址始终相同(“内部”和“外部”类)
-
第二种情况:
- “内部”类:
- init 调用在新地址创建一个新实例
- 然后将self设置为前一个实例并更改地址:OK
self已经有属性attr1和atrr2:好的但“在课堂之外”:
-
inst2有初始化的地址,没有属性!
怎么了?在 Python 中地址影响是如何工作的? 这样做是一种好方法吗?
【问题讨论】:
-
什么?你到底想实现什么?!
-
想象一下,如果你得到这个工作。语法会是什么样子?你将如何向其他人解释如何使用你的代码?
-
投反对票是匿名的,不需要 cmets(参见例如 meta.stackoverflow.com/q/250177/3001761)。更不用说您有评论了!如果你不能更明确,那么不要期待答案。你到底想做什么?通过
__init__实现奇怪的复制方法?为什么? -
什么是“地址影响”?
-
您不必使用继承,我的观点是在 Python 中实现替代构造函数的规范方法是使用
@classmethod。这感觉就像在和墙争吵,所以我不再评论。