|
|
1
102
扩展bp的答案,我想向您展示他所说的不变类型的含义。 首先,这没关系:
但是,这只适用于不可变(不可变)类型。如果默认值是可变的(意味着它可以被替换),则会发生以下情况:
注意A和B都有一个共享属性。这通常是不需要的。 当类型可变时,这是定义实例变量默认值的方法:
我的第一个代码片段工作的原因是,对于不可变的类型,只要您需要,Python就会创建一个新的实例。如果您需要添加1到1,那么Python会为您生成一个新的2,因为旧的1不能更改。我相信原因主要是散列。 |
|
|
2
45
这两个片段做了不同的事情,所以这不是一个品味的问题,而是一个在你的上下文中什么是正确的行为的问题。 Python documentation 解释不同之处,但以下是一些示例: 附件A
这种束缚
因此:
附件B
这种束缚
实际答案
图表B中的代码显然是错误的:为什么要将类属性(实例创建时的默认值)绑定到单个实例? 附件A中的代码是可以的。 但是,如果要为构造函数中的实例变量提供默认值,我会这样做:
…甚至:
…甚至:(首选,但如果且仅当您处理不可变类型时!)
您可以这样做:
|
|
|
3
4
使用类成员提供默认值非常有效,只要您只小心使用不可变的值。如果你试着用一张单子或口述来做,那将是非常致命的。它也适用于实例属性是对类的引用的情况,只要默认值为“无”。 我已经看到这个技术在repoze中非常成功地使用,repoze是一个运行在zope之上的框架。这里的优点不仅是当类被持久化到数据库时,只需要保存非默认属性,而且当您需要在架构中添加一个新字段时,所有现有对象都会看到具有默认值的新字段,而不需要实际更改stor。ED数据。 我发现它在更一般的编码中也能很好地工作,但它是一种风格。用你最喜欢的东西。 |
|
|
4
3
使用类成员作为实例变量的默认值不是一个好主意,而且这是我第一次看到提到这个主意。它在您的示例中有效,但在许多情况下可能会失败。例如,如果值是可变的,在未修改的实例上对其进行修改将更改默认值:
|
|
|
5
0
还可以将类变量声明为“无”,这将阻止传播。当您需要一个定义良好的类并希望防止attributeErrors时,这非常有用。 例如:
如果需要默认值:
当然,仍然遵循其他答案中关于使用可变类型和不可变类型作为默认类型的信息。
|