4

在 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

4 回答 4

5

理想情况下,您的构造函数不应该调用方法: 构造函数不应该做真正的工作

如果属性的数量不成比例地增长,你应该重构你的类,例如使用Extract Class将你的类分成几个类,从而尊重单一职责原则

于 2010-12-30T11:06:06.413 回答
4

这有什么问题:

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

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

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

或者,如果a,bc以某种方式相关并且您将它们初始化为相同的不可变值,则可以在单个赋值中声明它们:

class Foo:
    def __init__(self):
        self.a = self.b = self.c = 0
于 2010-12-30T10:46:53.613 回答
0

首先,这里说的不是类属性,而是实例属性。我的约定是将它们全部放在构造函数中,如果它们在另一种方法中初始化,则值为 None 。这样我总能知道会发生什么。这有点像声明它们,即使它不是强制性的。

例如:

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

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

于 2010-12-30T11:01:09.797 回答
0

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

正确的。

当我有一个包含很多属性的大类时,很难检索我类中的所有属性。

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

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

一个好的编辑器/IDE 可以帮助您找到定义。我为此使用了WingIDE,它非常好。

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

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

于 2010-12-30T11:21:01.973 回答