在Python中获取@classmethod的内部状态

时间:2018-05-12 20:05:41

标签: python syntax scope scoping

我正在使用其中定义了以下功能的库:

@classmethod
def from_file(cls, path):

    try:
        with open(path) as config_file:
            content = yaml.safe_load(config_file)
    except IOError:
        log.error(u"Can't open configuration file '%s'" % path)
        raise ConfigurationError

    return cls(content)

我从我自己的班级以下列方式调用:

class MyConfig(object):

    def __init__(self, custom_base_path=None, mappings_file_name=None):

    ....
            self.__cfg = self.__load_mappings_file(file=mappings_file_name)

    ....
def __load_mappings_file(self, file=None):

      ....

    return AttrHolder.from_file(filename)

AttrHolder类在同一模块中定义:

class AttrHolder(Config):
            schema = {
                "subject": {
                    "email": StringEntry,
                    "name": StringEntry
                    },
                "entitlements": {
                    "containerName": StringEntry(required=True)
                    },
            }

以下是第三方配置__init__的代码:

def __init__(self, content, _schema=None):
    if _schema:
        self.schema = _schema

    if self.schema and (not content or not isinstance(content, dict)):
        log.error(u"Invalid configuration")
        raise ConfigurationError

    self.entries = {}
    self.children = set()

    for key, value in self.schema.items():
        if isinstance(value, dict):
            setattr(self, key, Config(content.get(key), _schema=value))
            self.children.add(key)
        elif isinstance(value, ConfigEntry):
            self.parse_entry(key, value, (content or {}).get(key))
        else:
            log.warning(u"Invalid entry in configuration content: %s" % key)

我想知道如何在我的班级Config中使用第一节中的content字段?我需要这样做的原因是我发现(通过调试)AttrHolder.from_file()调用返回传递给它的结构的残缺表示。我希望保留content字段中似乎可用的原始表示形式。

谢谢。

1 个答案:

答案 0 :(得分:1)

只需使用您自己的AttrHolder子类:

class MyAttrHolder(AttrHolder):
    def __init__(self, content, _schema=None):
        do_things_with(content)
        super(MyAttrHolder, self).__init__(content, _schema)

...

MyAttrHolder.from_file(filename)

然后在from_file内,cls将是MyAttrHolder。这是classmethod

的要点