如何在Python中正确声明实例字段
这可能是个简单或者无聊的问题,但我对此有点困惑。
在定义实例字段时,推荐的(符合Python风格的)做法是放在构造函数里,还是直接在类的主体中声明呢?
class Foo:
""" Foo class """
# While we are at it, how to properly document the fields?
bar = None
def __init__(self, baz):
""" Make a Foo """
self.bar = baz
或者:
class Foo:
""" Foo class """
def __init__(self, baz):
""" Make a Foo """
self.bar = baz
2 个回答
3
为了简单起见,我们定义一个叫做 Foo 的类,并给它一个类变量 bar
:
In [34]: class Foo: bar = 1
现在,注意:
In [35]: a = Foo()
In [36]: a.bar
Out[36]: 1
In [37]: Foo.bar = 2
In [38]: a.bar
Out[38]: 2
对 Foo.bar
的修改会影响到这个类的所有现有实例。
因此,通常情况下,人们会避免使用类变量,而更倾向于使用实例变量,除非你想要这种副作用。
7
这其实是关于期望的问题。看你代码的人会期待在类的最上面定义的属性是类属性。但是如果你在__init__
里总是把它们替换掉,就会让人感到困惑。
所以,建议你选择第二种方式,也就是在__init__
里面定义实例属性。
至于如何记录这些属性,选择一种文档字符串的风格并坚持使用;我个人喜欢Google的风格,还有其他选择,比如numpy
的风格。
class Foo:
"""A class for foo-ing bazs.
Args:
baz: the baz to foo
Attributes:
bar: we keep the baz around
"""
def __init__(self, baz):
self.bar = baz