引用类变量时当前类的快捷方式

时间:2016-01-07 22:10:44

标签: python python-3.x self

我有一个像这样的类变量BASE_MATCHER(如果我没有正确理解的话,所有实例之间共享的值)

class PatchsetBase():
    # https://github.com/kullo/smartsqlite
    BASE_MATCHER = re.compile("https://github.com/([-a-z0-9]+)/([a-zA-Z0-9]+)(\.git)?")

    def __init__(self, url):
        match = BASE_MATCHER.match(url)
        if not match:
            raise InvalidGithubUrl("base url is not valid: '" + url + "'")
        self.user = match.group(1)
        self.project = match.group(2)

现在Python3在构造函数中告诉我:

  

NameError:name' BASE_MATCHER'未定义

我需要明确调用PatchsetBase.BASE_MATCHER才能使其正常工作。

有没有优雅的方法可以摆脱这种冗余?

1 个答案:

答案 0 :(得分:2)

一个选项是通过将第三个默认参数传递给它,包含您需要访问的__init__对象,使其在BASE_MATCHER内可见:

def __init__(self, url, matcher=BASE_MATCHER):
    match = matcher.match(url)
    if not match:
        raise InvalidGithubUrl("base url is not valid: '" + url + "'")
    self.user = match.group(1)
    self.project = match.group(2)

现在,您可以在__init__内访问此对象,但不会引发NameError。你也可以命名默认的arg BASE_MATCHER,如果这是一个问题:

def __init__(self, url, BASE_MATCHER=BASE_MATCHER):
    match = BASE_MATCHER.match(url)

这样做很有道理,但我会说实话,确实让我觉得有点不舒服

另一个选项(如评论中所指出的)使用self来访问self.BASE_MATCHER的共享对象。这是访问类变量的自然方式,但是,我不知道的是,至少从视觉方面来看,这似乎比PatchsetBase.BASE_MATCHER更优雅。

无论哪种方式,都不确定你定义的优雅,但这些是你可以考虑的两个简单选项。