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

当您使用设置初始化其中一个子类时,它们将按照您的预期进行。

于 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 回答
0

我会认为这样做更清洁

class SomeTask(BaseTask):
    settings = { 'foo': 'bar' }

class SomeOtherTask(BaseTask):
    settings = { 'bar': 'foo' }

前提是不对这些设置进行任何更改。

这样,更改与类紧密耦合,并且只有一个包含这些设置的 dict 对象。

于 2013-04-29T14:38:52.533 回答