【发布时间】:2018-06-25 13:40:39
【问题描述】:
我想创建一个具有级联功能的配置类。我这是什么意思?假设我们有一个这样的配置类
class BaseConfig(metaclass=ConfigMeta, ...):
def getattr():
return 'default values provided by the metaclass'
class Config(BaseConfig):
class Embedding(BaseConfig, size=200):
class WordEmbedding(Embedding):
size = 300
当我在代码中使用它时,我将按如下方式访问配置,
def function(Config, blah, blah):
word_embedding_size = Config.Embedding.Word.size
char_embedding_size = Config.Embedding.Char.size
最后一行访问Embedding 类'Char' 中不存在的属性。这应该调用getattr(),在这种情况下应该返回200。我对元类的熟悉程度不足以做出良好的判断,但我想我需要定义元类的__new__()。
这种方法有意义还是有更好的方法?
编辑:
class Config(BaseConfig):
class Embedding(BaseConfig, size=200):
class WordEmbedding(Embedding):
size = 300
class Log(BaseConfig, level=logging.DEBUG):
class PREPROCESS(Log):
level = logging.INFO
#When I use
log = logging.getLogger(level=Config.Log.Model.level) #level should be INFO
【问题讨论】:
-
我觉得元类没问题,你应该在元类中覆盖 getattr 然后以某种方式获取值。 (覆盖 new 并在你的情况下保存 kwargs)