类属性或参数的默认值

3

我在Python中找到了以下开源代码:

class Wait:

  timeout = 9

  def __init__(self, timeout=None):

    if timeout is not None:
        self.timeout = timeout
    ...

我想了解使用上述代码与使用默认参数值的优势是否存在差异:

class Wait:

   def __init__(self, timeout=9):
     ...

它们并不做相同的事情。类属性在实例之间是共享的。 - Avaris
@Avaris 当你执行 self.timeout = 9,在第二个示例构造函数中,你正在设置一个类变量/属性。 - Ben
1
@Ben 在你执行 self.x = ... 的时候,你正在设置一个实例属性。 - Gareth Latty
2
@Ben,不是的,你正在设置一个_instance_属性。在第二个示例中,Wait.timeout会引发attributeError。但在第一个示例中,它不会。 - senderle
2个回答

12

可以通过以下方式更改默认值:

Wait.timeout = 20

如果未设置,则意味着默认值为20。

例如:

>>> class Wait:
...     timeout = 9
...     def __init__(self, timeout=None):
...         if timeout is not None:
...             self.timeout = timeout
... 
>>> a = Wait()
>>> b = Wait(9)
>>> a.timeout
9
>>> b.timeout
9
>>> Wait.timeout = 20
>>> a.timeout
20
>>> b.timeout
9

这利用了Python在找不到实例属性时查找类属性的特性。


0
从语义上讲,类属性就像将默认超时时间作为类的公共接口的一部分。根据文档,最终用户可能会被鼓励阅读或更改默认值。
相反,使用默认参数值强烈暗示特定的默认值是实现细节,不应由类的最终用户来操作。

不。如果默认参数是实现细节,则其名称应以下划线开头,例如_timeout=9 - Ethan Furman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接