在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有类似的东西吗?
答案 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对象包含这些设置。