2016-12-15 12 views
0

後に子クラス内で基本クラスをインスタンス化:はのは、私はクラスAがあるとしましょう建設

ex1 = B(x1,y1,p1,q1) 

Aのインスタンスを作成し、その属性をBに割り当てるというエレガントな方法はありますか?それはあなたがに取得しているものだならば、このような

exA = A(x2,y2) 

#something like... 
ex1.A = exA 

#..so that 
print(ex1.x) #yields x2 
print(ex1.y) #yeilds y2 

答えて

1

ことを「コピーコンストラクタ」のようなものはありません - あなたはpythonで=をオーバーロードすることはできません。しかし、あなたは簡単にクラスBの関数を定義することができます。

def fromA(self,someA): 
    self.x = someA.x 
    self.y = someA.y 

ex1.fromA(exA)はあなたがやりたいだろう。また、Aでこれを定義することもできます。あなたがAまたはBでそれを定義しない場合は、むしろあなたの場合に初期化を使用することができます:

def __init__(self,p,q,someA): 
    self.fromA(someA). 
    self.p = p 
    self.q = q 

EDITあなたは親クラスのすべての属性をコピーするために何かをしたい場合は、親クラスのプットで:

def fromA(self,someA): 
    for att in someA.__dict__: 
     self.__dict__[att] = someA.__dict__[att] 

あなたがinitの外のものを追加した場合、この属性は、現在のオブジェクト内に存在していることを確認してみてくださいに包まれる必要があります。

+0

感謝を。私はこのようにすることを考えましたが、このオプションは非常に厄介です。基本クラスを変更するたびにこの関数を更新し続ける必要があります。私がこれを行うと思ったもう1つの方法は、__dict__属性を比較して変更することでしたが、よりエレガントなものが可能な場合は、それほど遠くに行きたくありません。 –

+0

私は参照してください。関数のクラスの属性のリストを使用し、それらのすべてをループするオプションがあります。これは機能を変更する必要はありません。これはまた、親に関数が必要であることを意味します。あなたは私に例を示すか、私が話していることを知っていますか? – kabanus

+0

ありがとう、はい私はループビットを行う方法を知っています。それは私が '__dict__ 'を通して属性を変更することによって意味されました。 –

1

Aを引数とするBのクラスメソッドを記述できます。

class B(A): 
    def __init(self, x, y, p, q): 
     A.__init__(self, x, y) 
     self.p = p 
     self.q = q 

    @classmethod 
    def fromA(cls, A, p, q): 
     return cls(A.x, A.y, p, q) 

今、あなたは行うことができます。返信するための

exA = A(x2,y2) 
exB = B.fromA(exA, p1, q1) 

print(exB.x) #yields x2 
print(exB.y) #yeilds y2 
関連する問題