<p>将它们定义为类变量可能是最有前途的方法,因为您以后可以使用<a href="https://en.wikipedia.org/wiki/Dependency_injection" rel="nofollow">dependency injection</a>来更改这些变量,这对<a href="https://docs.python.org/2/library/unittest.html" rel="nofollow">unit testing</a>非常有用。例如:</p>
<pre><code>class Server:
def __init__(self, url, icon):
self.url = url
self.icon = icon
server = Server('url.com', 'file.ico')
# in your tests, you may want to use a different ico/url
test_server = Server('url.com', 'test_icon.ico')
</code></pre>
<h3>关于接二连三的注记:</h3>
<p>还要注意的是,在Python中,getter和setter倾向于避免使用,如果需要验证,则使用<a href="https://docs.python.org/2/library/functions.html#property" rel="nofollow">properties</a>代替<em>,或者重构具有大量依赖代码的类</em>。在Java和C等预编译语言中,getter/setter用于封装,以便以后可以更改实现,但在Python中,为了提高性能和清晰度,避免使用getter/setter。因此,首先,变量可以正常访问,如果实现发生更改,那么可以使用<code>@property</code>和<code>@variable.setter</code>修饰符,以便使用getter和setter,即使您看起来是直接访问变量。</p>
<p>因此,最初您可以直接访问<code>icon</code>。</p>
<pre><code>print(server.icon)
</code></pre>
<p>但让我们说,稍后重构类中的<code>icon</code>为<code>_icon_file</code>和<code>_icon_image</code>,并在每次设置时加载文件,但应用程序的其余部分需要<code>icon</code>变量。这就是getter和setter通常的用途(以及对设置变量的任何检查/转换),因此我们现在可以为<code>icon</code>添加getter和setter,即使<code>icon</code>变量不再存在:</p>
<pre><code>class Server:
def __init__(self, url, icon_filename):
self.url = url
self._icon_filename = icon_filename
self._icon_image = self._load_icon(icon_filename)
@property
def icon(self):
"""
Get the icon file name
@returns str of the icon filename
"""
return self._icon_filename
@icon.setter
def icon(self, icon_filename):
"""
Load a new icon file as the icon
@param icon_filename the relative path to the icon file
"""
if icon_filename[-4:] != '.ico':
raise Exception('Must be of .ico format')
self._icon_filename = icon_filename
self._icon_image = self._load_icon(icon_filename)
def _load_icon(self, icon_filename):
"""
Load a .ico file, and maybe do some other stuff
@returns Image of the loaded icon
@private
"""
# implementation here...
server = Server('url.com', 'file.ico')
print(server.icon) # file.ico
server.icon = 'icon2.ico' # sets and loads new icon
print(server.icon) # icon2.ico
server.icon = 'icon3.jpg' # throws an exception
</code></pre>