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

2024-05-26 11:11:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类变量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' is not defined

我需要显式地调用PatchsetBase.BASE_MATCHER才能使其工作。在

有什么优雅的方法可以消除这种冗余吗?在


Tags: 实例httpsselfgithubcomurlbaseis
1条回答
网友
1楼 · 发布于 2024-05-26 11:11:55

一种方法是通过向其传递第三个默认参数,使其在__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。您也可以将默认参数命名为BASE_MATCHER,如果这是一个问题:

^{pr2}$

这确实很好,但我说实话,这确实让我觉得有点不舒服。在

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

无论哪种方式,不完全确定你所定义的优雅,但这是两个简单的选择,你可以考虑。在

相关问题 更多 >