Python - 在类中声明属性的惯例是什么?

时间:2010-12-30 10:39:54

标签: python convention coding-style

在Python中,我可以在整个类中声明属性。例如:

class Foo:
def __init__(self):
    self.a = 0

def foo(self):
    self.b = 0

当我有一个具有大量属性的大类时,很难检索我班级中的所有属性。

使用以下代码(a)或下面的代码(b)是否更好:

a)在这里,很难找到所有属性:

class Foo:
    def __init__(self):
        foo_1()
        foo_2()

    def foo_1(self):
        self.a = 0
        self.b = 0

    def foo_2(self):
        self.c = 0

b)在这里,很容易找到所有属性,但它很漂亮吗?

class Foo:
    def __init__(self):
        (self.a, self.b) = foo_1()
        self.c = foo_2()

    def foo_1(self):
        a = 0
        b = 0
        return (a, b)

    def foo_2(self):
        c = 0
        return c

简而言之,在类中声明属性的惯例是什么?

编辑:

当然,这是一个简单的例子,不需要在这里改进我​​的代码。想象一下,在_ init _ ()中调用了一个复杂的类,其中包含许多“小方法”(以划分我的代码,以提高可读性)。

4 个答案:

答案 0 :(得分:4)

这有什么问题:

class Foo:
    def __init__(self):
        self.a = 0
        self.b = 1
        self.c = 2

或者如果abc以某种方式相关,您可以在一行中声明它们:

class Foo:
    def __init__(self):
        self.a, self.b, self.c = 0, 1, 2

或者如果abc以某种方式相关,那么您将它们初始化为相同的不可变值,您可以声明它们在一项任务中:

class Foo:
    def __init__(self):
        self.a = self.b = self.c = 0

答案 1 :(得分:4)

理想情况下,构造函数不应调用方法:a constructor should not do real work

如果属性数量增长不成比例,您应该重构您的类,例如使用Extract Class将您的班级分成几个类,从而尊重single responsibility principle

答案 2 :(得分:0)

首先,你不是在谈论类属性,而是实例属性。我的约定是构造函数中的所有它们,如果它们在另一个方法中初始化,则值为None。这样我总能说出会发生什么。这有点像宣布它们,即使它不是强制性的。

e.g:

class Foo(object):
    def __init__(self, a=None, b=None, c=None):
        self.a = a
        self.b = b
        self.c = c

好吧,我也想将inititializers作为关键字参数,它使它更灵活。我也可以通过这种方式轻松覆盖默认值。

答案 3 :(得分:0)

  

在Python中,我可以声明属性   全班同学。

正确。

  

很难找回所有内容   当我有一个时,我班上的属性   具有很多属性的大班。

不。 dir(object)obj.__dict__在那里很有帮助。此外,为什么要检索所有属性?

  

在这里,很难找到所有   属性

一个好的编辑器/ IDE可以帮助您找到定义。我使用WingIDE,这很不错。

  

在这里,很容易找到所有   属性,但它是美丽的吗?

嗯,这个特殊的代码,也许不是,但是在__init__或类中声明所有公共属性是很常见的(但是当你这样做时要注意Jabberwock)。这样你知道它们是可用的,这很好。