Python - 你在类中声明属性的习惯是什么?
在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
或者,如果 a
、b
和 c
之间有某种关系,你可以在一行里声明它们:
class Foo:
def __init__(self):
self.a, self.b, self.c = 0, 1, 2
或者,如果 a
、b
和 c
之间有某种关系 并且 你把它们初始化为相同的不可变值,你可以在一次赋值中声明它们:
class Foo:
def __init__(self):
self.a = self.b = self.c = 0
5
理想情况下,你的构造函数不应该调用其他方法:构造函数不应该做实际的工作。
如果你的属性数量变得过多,你应该对你的类进行重构,比如可以使用提取类的方法,把一个类拆分成几个类,这样可以遵循单一职责原则。