0

我正在对 ReviewBoard (RBtools) 进行自定义修改;但是,我似乎无法理解 Python 在这一步隐含地在做什么。

我试图了解ReviewBoardServer它的值在哪里设置self.info.path

我通过调试器并跟踪它method check_api_version在线

self.root_resource = root_resource

在此语句之前,我们有self.infoas None,但它很快变为SVNRepositoryInfo上面一行之后的 a。

上面的行没有设置该行中的类字段self.info。我猜 Python 正在做一些允许它self._info通过设置来填充的东西self.root_resource?这个对吗?如果是这样,我在哪里可以找到有关此的更多信息?

作为参考,init 方法如下所示:

 185 class ReviewBoardServer(object):
 186     """
 187     An instance of a Review Board server.
 188     """
 189     def __init__(self, url, info, cookie_file):
 190         self.url = url
 191         if self.url[-1] != '/':
 192             self.url += '/'
 193         self._info = info
 194         self._server_info = None
 195         self.capabilities = None
 196         self.root_resource = None
 197         self.deprecated_api = False
 198         self.rb_version = "0.0.0.0"
 199         self.cookie_file = cookie_file
 200         self.cookie_jar  = cookielib.MozillaCookieJar(self.cookie_file)
 201         self.deprecated_api = False
 202         self.root_resource = None

作为参考,具体文件托管在下面的 Github 上: https ://github.com/reviewboard/rbtools/blob/release-0.4.3/rbtools/postreview.py

4

1 回答 1

1

您可以使用描述符和内置property()函数在 Python 中“在后台”执行类似的操作。有关更多详细信息,请参阅文档中的实现描述符。

源文件有postreview.py一行:

627     info = property(_get_server_info)

它为名为 的类属性定义了一个__get__()函数。ReviewBoardServerinfo

的定义_get_server_info()在源代码的正上方:

def _get_server_info(self):
    if not self._server_info:
        self._server_info = self._info.find_server_repository_info(self)

    return self._server_info

如您所见,每当info检索到 的值时,如果 的值为self._server_infoNone则将其设置为某个值,然后将其值作为属性的值返回。

于 2014-07-30T00:52:23.997 回答