0

ベースに変数を使用する必要があるため、型を持つクラスを作成します。メソッドを提供しなくても問題なく動作しますが、__init__メソッドを提供すると、ベースの を呼び出すことができません__init__

作品:

def constructor():
    blah blah
    api = importlib.import_module(xtype)
    mc = type('mc', (api.aclass,), {})
    obj = mv(**args)
    return obj

動作しません。" SystemError: super(): __class__ cell not found"を返します

def constructor():
    blah blah
    api = importlib.import_module(xtype)
    mc = type('mc', (api.aclass,), dict(__init__ = mc__init)
    obj = mc(**args)
    return obj

def mc_init(*args, **kwargs):
    do_some_stuff
    super().__init__(*args, **kwargs)

は機能せず、Base mc.__init__ not called.後でオブジェクト作成時に " " を返します:

def constructor():
    global api
    blah blah
    api = importlib.import_module(xtype)
    mc = type('mc', (api.aclass,), dict(__init__ = mc__init)
    obj = mc(**args)
    return obj

def mc_init(*args, **kwargs):
    global api
    do_some_stuff
    api.aclass.__init__(*args, **kwargs)

x = constructor()

基本クラスのinitを呼び出すにはどうすればよいですか?

ありがとう。

4

1 に答える 1

1

あなたのtype通話が機能していることに驚いています。basesタプル ( ) にする必要があります(api.aclass,)。これは単なるタイプミスですか?

super()(2) の呼び出しは、クラス宣言の外にあるため機能しません。Python 3superのマジックは非常に複雑で、正直に言うと少し脆弱です。あなたは書くことができますsuper(mc, self).__init__(*args, **kwargs)

ただし、ここで適切なクラス宣言を使用しない理由はありません (特に 3-argument の使用方法を理解していない場合type)。Python は、クラスが変数ベースで宣言されていてもまったく問題ありません。

def constructor():
    ...
    api = importlib.import_module(xtype)
    class mc(api.aclass):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
    obj = mc(**args)
    return obj
于 2012-07-05T08:55:26.170 に答える