在类的开始还是结束放置__init__更符合最佳实践?
考虑以下代码:
class AClass():
def defaultMethod(self):
return 1
def __init__(self, methodToUse = defaultMethod):
print (methodToUse(self))
if __name__== "__main__":
AClass()
在这种情况下,如果我把defaultMethod放到__init__方法下面,就会出现“NameError: name 'defaultMethod' is not defined”的错误。
这意味着我必须在__init__之前定义这个方法,否则Python就不知道这个方法的存在。这样一来,我就不能把__init__放在第一个位置了,这让我开始思考,通常情况下__init__方法是放在类的开头还是结尾呢?
4 个回答
1
__init__
通常放在一个类的开头,因为当我们创建这个类的实例时,它是第一个被执行的部分。不过在你的情况下,它需要放在类的后面,这样的话,建议你在代码里加个注释,告诉其他开发者这个设计的原因。
4
你说的“我需要在初始化之前定义这个方法,否则Python就不知道它是什么”是什么意思呢?
>>> class A(object):
... def __init__(self):
... self.foo()
... def foo(self):
... print '42'
...
>>> A()
42
我一般会把 __ init__() 放在其他实例方法之前,但放在类的方法、属性之后。
4
我觉得你的做法有点奇怪。你应该把 __init__
方法放在前面,最好是第一个。可读性很重要,__init__
方法能清楚地告诉别人你期望的主要实例字段是什么。
这里有三种替代方案。我个人比较喜欢第一种,因为它记录了默认的方法,并且对你的代码修改最小。最后一种方法也能用,但可能会让以后维护你代码的人感到困惑。
class A(object):
def __init__(self, method="foo"):
if callable(method):
method(self)
else:
getattr(self, method)()
def foo(self):
print "something"
class B(object):
def __init__(self, method = None):
if method is None:
self.defaultMethod()
else:
method(self)
def defaultMethod(self):
print "foo"
def _defaultMethod(self):
print self.x
class C(object):
def __init__(self, method = _defaultMethod):
self.x = "bleh"
method(self)
def anotherMethod(self):
print "doing something else"
def defaultMethodProxy(self):
_defaultMethod(self)