这两个片段做了不同的事情,所以这不是一个品味的问题,而是一个在你的上下文中什么是正确的行为的问题。
Python documentation
解释不同之处,但以下是一些示例:
附件A
class Foo:
def __init__(self):
self.num = 1
这种束缚
num
到比赛场地
实例
. 对此字段的更改不会传播到其他实例。
因此:
>>> foo1 = Foo()
>>> foo2 = Foo()
>>> foo1.num = 2
>>> foo2.num
1
附件B
class Bar:
num = 1
这种束缚
号码
去酒吧
班
. 更改已传播!
>>> 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