3

私はクラスを使用しているpythonプログラムを作成しています。あるクラスが別のクラスから選択的に継承するだけにしたいです。

class X(object):
    def __init__(self):
        self.hello = 'hello'

class Y(object):
    def __init__(self):
        self.moo = 'moo'

class Z():
    def __init__(self, mode):
        if mode == 'Y':
             # Class will now Inherit from Y
        elif mode == 'X':
             # Class will now Inherit for X

別のクラスを作成せずにこれを行うにはどうすればよいですか?

4

4 に答える 4

3

Pythonでは、クラスは実行時に作成できます。

class X(object):
    def __init__(self):
        self.hello = 'hello'

class Y(object):
    def __init__(self):
        self.moo = 'moo'

def create_class_Z(mode):
    base_class = globals()[mode]
    class Z(base_class):
        def __init__(self):
            base_class.__init__(self)
    return Z

ZX = create_class_Z('X')
zx = ZX()
print(zx.hello)

ZY = create_class_Z('Y')
zy = ZY()
print(zy.moo)
于 2012-09-19T09:44:33.900 に答える
2

これを行うには、渡されたものをオーバーライド__new__して変更しclsます(追加するXY、基本クラスとして新しい型を作成します)。

class X(object):
    def __init__(self):
        self.hello = 'hello'

class Y(object):
    def __init__(self):
        self.moo = 'moo'

class Z(object):
    def __new__(cls, mode):
        mixin = {'X': X, 'Y': Y}[mode]
        cls = type(cls.__name__ + '+' + mixin.__name__, (cls, mixin), {})
        return super(Z, cls).__new__(cls)
    def __init__(self, mode, *args, **kwargs):
        super(Z, self).__init__(*args, **kwargs)

無限再帰を回避するには、をバイパスZ.__new__する必要があることに注意してください。これは、特別なオーバーライドメソッドsuperの標準パターンです。__new__

于 2012-09-19T09:45:58.203 に答える
0

を使用したソリューションtype:

class _Z(): pass #rename your class Z to this

def Z(mode): #this function acts as the constructor for class Z
    classes = {'X': X, 'Y': Y, 'Foo': Bar} #map the mode argument to the base cls
    #create a new type with base classes Z and the class determined by mode
    cls = type('Z', (_Z, classes[mode]), {})
    #instantiate the class and return the instance
    return cls()
于 2012-09-19T09:55:03.117 に答える
0

Z 内に 2 つのメンバーを定義した方がよいと思います。1 つは X のクラス インスタンス、もう 1 つは Y のインスタンスです。異なるモードを使用しながら、これらのインスタンスに格納されている関連情報を取得できます。

于 2012-09-19T09:36:43.113 に答える