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

如何在Python中正确声明实例字段,python,coding-style,Python,Coding Style,这可能是一个愚蠢/琐碎的问题,但我对这件事感到困惑 声明实例字段的受鼓励(pythonic)方式是什么?是在构造函数中,还是在类主体本身中 class Foo: """ Foo class """ # While we are at it, how to properly document the fields? bar = None def __init__(self, baz): """ Make a Foo """ se

这可能是一个愚蠢/琐碎的问题,但我对这件事感到困惑

声明实例字段的受鼓励(pythonic)方式是什么?是在构造函数中,还是在类主体本身中

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
或:


为了简单起见,让我们用一个类变量
bar
定义类Foo:

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
的更改会影响类的现有实例


因此,通常避免使用类变量,而不是实例变量,除非需要这些副作用。

为了简单起见,让我们使用类变量
bar
定义类Foo:

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
的更改会影响类的现有实例


因此,通常避免使用类变量,而不是实例变量,除非需要这些副作用。

这是一个期望问题。阅读代码的人会期望在类的顶层定义的属性是类属性。然后总是在
\uuuu init\uuuu
中替换它们,这只会造成混乱

因此,您应该使用选项2,在
\uuuu init\uuuu
中定义实例属性

在记录属性方面,选择docstring样式并坚持它;我喜欢,其他选择包括


这是一个期望的问题。阅读代码的人会期望在类的顶层定义的属性是类属性。然后总是在
\uuuu init\uuuu
中替换它们,这只会造成混乱

因此,您应该使用选项2,在
\uuuu init\uuuu
中定义实例属性

在记录属性方面,选择docstring样式并坚持它;我喜欢,其他选择包括


我认为第二个是更好的文档:我只是在字段下面写
“bar initial value”“”
。对我来说,第一个读起来像类属性,而不是实例属性()。总有一天,你会忘记在
\uuu init\uuuu()
中分配到
,结果不经意地得到一个class属性(和一个很难找到的bug)。出于这些原因,我每周每天都会使用#2。@NPE如果一个方法将其设置为
self.foo=123
,这会覆盖“class属性”效果并使其成为实例属性吗?因为如果是这样的话,那么我对此没意见-class属性将只保留一个从未更改过的默认值。我认为第二个更好的文档:我只需在字段下面写
“bar initial value”“”
。对我来说,第一个读起来像class属性,而不是实例属性()。总有一天,你会忘记在
\uuu init\uuuu()
中分配到
,结果不经意地得到一个class属性(和一个很难找到的bug)。出于这些原因,我每周每天都会使用#2。@NPE如果一个方法将其设置为
self.foo=123
,这会覆盖“class属性”效果并使其成为实例属性吗?因为如果是这样的话,那么我就可以了——class属性将只保留一个从未更改过的默认值。然而,在第一个例子中,正如它所写的,
bar
不被
Foo
的实例共享。那么这一说法是正确的还是错误的呢?我完全不想分享任何东西。@也许我已经添加了一个示例来演示。NPE是对的,我的示例并不完全是您的代码。然而,我确实认为这涉及到你所问的更一般的问题。我知道你是从哪里来的。然而,在第一个例子中,正如它所写的,
bar
不被
Foo
的实例共享。那么这一说法是正确的还是错误的呢?我完全不想分享任何东西。@也许我已经添加了一个示例来演示。NPE是对的,我的示例并不完全是您的代码。然而,我确实认为这是你问的更一般的问题。我喜欢谷歌的方法,它更具可读性。我想我会把我的项目转换成这个。我喜欢谷歌的方法,它更具可读性。我想我会把我的项目转换成这个。