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

4 投票
4 回答
4637 浏览
提问于 2025-04-16 09:12

在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

首先,你这里说的不是类属性,而是实例属性。我的习惯是把所有的实例属性都放在构造函数里,如果它们是在其他方法中初始化的,就把它们的值设为None。这样我就能清楚地知道会有什么属性。这有点像是在声明它们,尽管这并不是必须的。

比如:

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

另外,我也喜欢把初始化参数设置成关键字参数,这样会更灵活。我可以很方便地覆盖默认值。

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
5

理想情况下,你的构造函数不应该调用其他方法:构造函数不应该做实际的工作

如果你的属性数量变得过多,你应该对你的类进行重构,比如可以使用提取类的方法,把一个类拆分成几个类,这样可以遵循单一职责原则

撰写回答