私はPythonでクラスB、Aのサブクラスを定義しようとしています。これは、非常に柔軟になるようにインスタンス化する複数の方法を受け入れることができます。A はメンバーが少ない単純なクラスです。A を記述して、位置/キーワード引数の組み合わせを許可し、一部の引数が省略された場合にデフォルト値を持つ方法を知っています。
私の問題はクラス B にあります。B は単に A に追加のメンバーが追加されたものです。しかし、B のインスタンスを作成するときは、次のいずれかを選択したいと考えています。
- 位置引数/キーワード引数の組み合わせから作成されたインスタンス (A によく似ています)
- 追加のメンバーと A の既存のインスタンス (またはコピー) を指定して作成されたインスタンス
- A の既存のインスタンスのみを使用して作成され、余分なメンバーはデフォルト値を取得します。
- A の既存のインスタンスと位置/キーワード引数の使用を相互に排他的にする
編集:このようなもの
class A:
def __init__(self, x1=1, x2='a', x3=4.0)
self.x1=x1
self.x2=x2
self.x3=x3
class B(A):
def __init__(self, x1=1, x2='a', x3=4.0, x4='t')
self.x4=x4
A.__init__(x1,x2,x3)
しかし、次のように使用したいと思います。
a1=A()
b1=B() # takes all defaults
b2=B(x4='r') # x1,x2,x3 gets defaults from A
b3=B(a1,x4='z') # use a1, an instance of A
b4=B(x1,x2,x3,x4) # defines manually all arguments
b5=B(a1,x1=2) # this one should not work because x1 can come from the instance a1 or x1