2

Python には、タスク クラスに関連する設定の辞書があります。これらのタスクの親コンストラクターでは、関連する設定のみを保存したいと思いますが、これを行うには、親クラスから子クラスにアクセスする必要があります。

settings = {
    SomeTask: { 'foo': 'bar' },
    SomeOtherTask: { 'bar': 'foo' },
}

class SomeTask(BaseTask):
    pass

class SomeOtherTask(BaseTask):
    pass

class BaseTask:
    def __init__(self, settings):
        self.settings = settings[child_class]

PHP ではget_class($this);、コンストラクターを呼び出すことでこれを行うことができます (親ではなく子クラス名を返します)。Python には似たようなものがありますか?

4

3 に答える 3

3

これを行うだけです:

class BaseTask:
    def __init__(self, settings):
        self.settings = settings[self.__class__]

class SomeTask(BaseTask):
    pass

class SomeOtherTask(BaseTask):
    pass

設定を使用して子クラスの 1 つを初期化すると、期待どおりに動作します。

于 2013-04-29T14:24:20.417 に答える
1

PHPコードに最も近いPythonの同等物...

$class_name = get_class($my_object)

...は...

class_name = my_object.__class__.__name__

...これは、古いスタイルと新しいスタイルの Python クラスの両方で機能するはずです。

実際、クラス オブジェクトへの参照を使用するのではなく、名前でクラスにインデックスを付ける場合は、settingsパラメーターを渡す必要はなく (循環参照を回避するためだけに行ったと思います)、グローバルにアクセスします。settings直接変数...

settings = {
    'SomeTask': { 'foo': 'bar' },
    'SomeOtherTask': { 'bar': 'foo' },
}

class BaseTask:
    def __init__(self):
        self.settings = settings[self.__class__.__name__]

class SomeTask(BaseTask):
    pass

class SomeOtherTask(BaseTask):
    pass
于 2013-04-29T14:24:31.107 に答える