这两个片段所做的事情是不同的,所以这不是品味的问题,而是在你的环境中什么是正确行为的问题。Python文档解释了两者之间的差异,但以下是一些示例:
证物Aclass Foo:
def __init__(self):
self.num = 1
这结合了num敬福实例...。对此字段的更改不会传播到其他实例。
因此:>>> foo1 = Foo()
>>> foo2 = Foo()
>>> foo1.num = 2
>>> foo2.num
1
展览Bclass Bar:
num = 1
这结合了num敬福类...。改变被传播!>>> bar1 = Bar()
>>> bar2 = Bar()
>>> bar1.num = 2 #this creates an INSTANCE variable that HIDES the propagation
>>> bar2.num
1
>>> Bar.num = 3
>>> bar2.num
3
>>> bar1.num
2
>>> bar1.__class__.num
3
实际答案如果我不需要一个类变量,而只需要为我的实例变量设置一个默认值,那么这两个方法是否都一样好呢?或者他们中的一个比另一个更“琵琶”?
证据B中的代码显然是错误的:为什么要将类属性(实例创建的默认值)绑定到单个实例?
证物A里的密码没问题。
但是,如果要在构造函数中为实例变量提供默认值,我将这样做:class Foo:
def __init__(num = None):
self.num = num if num is not None else 1
...甚至:class Foo:
DEFAULT_NUM = 1
def __init__(num = None):
self.num = num if num is not None else DEFAULT_NUM
...甚至:(更好,但前提是,只有当你在处理不可变的类型!)class Foo:
def __init__(num = 1):
self.num = num
这样你就可以做到:foo1 = Foo(4)
foo2 = Foo() #use default