这两个代码段执行不同的操作,所以这不是品味问题,而是您所处上下文中正确行为的问题。Python文档解释了差异,但是这里有一些示例:
展览A
class Foo:
def __init__(self):
self.num = 1
这绑定num
到Foo实例。对该字段的更改不会传播到其他实例。
从而:
>>> foo1 = Foo()
>>> foo2 = Foo()
>>> foo1.num = 2
>>> foo2.num
1
展览B
class Bar:
num = 1
这绑定num
到Bar类。变化正在传播!
>>> bar1 = Bar()
>>> bar2 = Bar()
>>> bar1.num = 2
>>> bar2.num
1
>>> Bar.num = 3
>>> bar2.num
3
>>> bar1.num
2
>>> bar1.__class__.num
3
实际答案
如果我不需要类变量,而只需要为实例变量设置默认值,那么这两种方法是否一样好?还是其中一个比另一个更“ pythonic”?
为此,展览B中的代码是完全错误的:为什么要将类属性(实例创建时的默认值)绑定到单个实例?
展览A中的代码可以。
如果要在构造函数中为实例变量提供默认值,则可以这样做:
class Foo:
def __init__(self, num = None):
self.num = num if num is not None else 1
...甚至:
class Foo:
DEFAULT_NUM = 1
def __init__(self, num = None):
self.num = num if num is not None else DEFAULT_NUM
...甚至:(最好,但仅当您要处理不可变类型时才可以!)
class Foo:
def __init__(self, num = 1):
self.num = num
这样,您可以执行以下操作:
foo1 = Foo(4)
foo2 = Foo()
self.attr = attr or []
在__init__
方法中编写即可。(我认为)它可以达到相同的结果,并且仍然清晰易读。