在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 _ ()中调用了一个复杂的类,其中包含许多“小方法”(以划分我的代码,以提高可读性)。
答案 0 :(得分: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
答案 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)。这样你知道它们是可用的,这很好。