如何在Python中正确声明实例字段

4 投票
2 回答
3328 浏览
提问于 2025-04-18 16:21

这可能是个简单或者无聊的问题,但我对此有点困惑。

在定义实例字段时,推荐的(符合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

撰写回答