2013-04-14 204 views
1

我有一个类:如何从父对象创建对象?

class Foo(): 
    def __init__(self): 
     self.a = 1 

和它的孩子:

class Bar(Foo): 
    def __init__(self, foo, string): 
     Foo.__init__(self) 
     self.b = string 

我需要创建一个Foo() - 从酒吧对象() - 对象 我如何能做到这一点?

即:

a = Foo() 
a.a = 2 
print a.a 

b = Bar(a, 'ololo') 

print b.a 
print b.b 

我得到这个印:

2 
1 
ololo 

,并期待这样的:

2 
2 
ololo 
+4

目前还不清楚你想达到的目标。请注意,'bar .__ init__'中未使用'foo'。 –

+0

将“b.a”设置为“2”的位置? –

+0

你的问题说你想从一个Bar对象创建一个Foo对象,但是你的代码表明你正试图从一个Foo对象创建一个Bar对象。 –

回答

0

我想请您谈一下拷贝构造函数。在这里,你可以找到如何在Python中创建一个办法 - Is this the equivalent of a copy constructor in Python?

import copy 
class Bar(Foo): 
    def __init__(self, foo, string): 
     if foo: 
      self.__dict__ = copy.deepcopy(foo.__dict__) 
     else: 
      Foo.__init__(self) 

     self.b = string 
+2

这很危险 - 这只会复制'dict'中的引用,这意味着这些对象最终会被可变对象链接。有一个原因,'__copy __()'没有默认实现 - 这不是一项简单的任务。 –

+0

@Lattyware +1,deepcopy可以帮助我想,我同意它危险,但在简单情况下工作 – ndpu

0

当您设置AA = 2,设置只在您的Foo类的单个实例变量,而不是在改变变量班级“蓝图”本身。因此,当使用Foo类作为父类时,原始self.a变量保留:a = 1

这意味着子类Bar继承变量self.a = 1,这就是为什么它已经打印为它在你的例子中。

除此之外,我不确定你要达到的目标,对不起。

-1

要使用“Foo”实例来设置“Bar”实例的某些变量,您不需要遗产。因为你需要的不是Foo类,实际上你只需要一个Foo实例:

class Bar: 
    def __init__(self,foo,string): 
     self.b=string 
     if isinstance(foo,Foo): 
      self.a=foo.a