我有一个像这样的类变量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
才能使其正常工作。
有没有优雅的方法可以摆脱这种冗余?
答案 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
更优雅。
无论哪种方式,都不确定你定义的优雅,但这些是你可以考虑的两个简单选项。