Вы можете сделать это без метаклассов, используя декораторы. Этот способ немного более понятен ИМО:
def apply_defaults(cls):
defaults = {
'default_value1':True,
'default_value2':True,
'default_value3':True,
}
for name, value in defaults.items():
setattr(cls, name, some_complex_init_function(value, ...))
return cls
@apply_defaults
class Settings(object):
pass
До Python 2.6 декораторы класса были недоступны. Таким образом, вы можете написать:
class Settings(object):
pass
Settings = apply_defaults(Settings)
в старых версиях python.
В приведенном примере apply_defaults
можно использовать повторно ... Ну, за исключением того, что значения по умолчанию жестко заданы в теле декоратора :) Если у вас есть только один случай, вы можете даже упростить свой код до этого:
defaults = {
'default_value1':True,
'default_value2':True,
'default_value3':True,
}
class Settings(object):
"""Your implementation goes here as usual"""
for name, value in defaults.items():
setattr(Settings, name, some_complex_init_function(value, ...))
Это возможно, поскольку классы (в смысле типов) сами являются объектами в Python.