2013-04-14 239 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