Ответ 1
Вы можете сделать это без метаклассов с помощью декораторов. Этот способ немного более ясен. IMO:
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.