访问父级中的子类实例

时间:2013-04-29 14:18:48

标签: python oop python-2.7

在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有类似的东西吗?

3 个答案:

答案 0 :(得分:3)

这样做:

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

class SomeTask(BaseTask):
    pass

class SomeOtherTask(BaseTask):
    pass

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

答案 1 :(得分:1)

最接近Python的PHP代码......

$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

答案 2 :(得分:0)

我认为做得更干净

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

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

未对这些设置进行任何更改。

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