具有类定义中的属性的Python样式

时间:2017-01-26 10:30:14

标签: python

我有一个类,我想要使用这些方法。什么是使用它的最pythonic方式?有关于这些样式问题的文件吗?我使用pylint和pep8来解决这类问题,但是这些程序在这个例子中没有显示任何带有属性的错误

class A(object):
        BLOCK_SIZE = 8192

        def func1(self):
                print self.BLOCK_SIZE
        def func2(self):
                print A.BLOCK_SIZE

如果我理解正确,这两个案例是相同的,但我不是 知道是否更好地引用类名或使用自引用。

由于

2 个答案:

答案 0 :(得分:3)

您应该更喜欢self

有两种类型的字段 - 类变量和对象变量。

类变量是在该类的所有对象(实例)访问它们的意义上共享的。只有类变量的副本,当任何一个对象对类变量进行更改时,更改也会反映在所有其他实例中。

对象变量由类的每个单独对象/实例拥有。在这种情况下,每个对象都有自己的字段副本,即它们不共享,并且在同一类的不同实例中以相同的名称与字段无关。

使用A.BLOCK_SIZE - 您可以使用self.BLOCK_SIZE获取类变量,但您可以获得特定对象的属性。

选中此项以获取详细示例和说明。 https://www.ibiblio.org/g2swap/byteofpython/read/class-and-object-vars.html

答案 1 :(得分:1)

类属性可以或多或少地用作实例属性的默认值。该语言允许从类本身或类的任何实例读取类属性,前提是该实例没有相同名称的属性。

但是对于写访问,情况会有所不同:A.BLOCK_SIZE=16384将更改全局类属性,而self.BLOCK_SIZE=16384将创建(或更新)具有相同名称的实例属性。

以下是您班级的一个小例子:

>>> a = A()
>>> a.func1()               # access the class attribute
8192
>>> a.func2()               # access the class attribute too
8192
>>> a.BLOCK_SIZE=4096       # create an instance attribute of same name
>>> a.func1()               # access the INSTANCE attribute
4096
>>> a.func2()               # still access the class attribute
8192

这就是为什么你应该在常见的circonstances下使用实例语义(self.BLOCK_SIZE),因为它不依赖于类名并允许每个实例覆盖。

只有在您想要更改class属性时才应使用类语义A.BLOCK_SIZE,或者即使存在实例属性也需要使用class属性。