请考虑以下代码:
class AClass():
def defaultMethod(self):
return 1
def __init__(self, methodToUse = defaultMethod):
print (methodToUse(self))
if __name__== "__main__":
AClass()
在这种情况下,无法移动__init__方法下面的defaultMethod,如果我这样做,则会导致“NameError:name'defaultMethod'未定义”
这意味着我需要在__init__之前定义此方法,否则Python不知道它。这又意味着我不再使用__init__作为第一种方法,这让我想知道是否通常将__init__方法放在类的末尾或开头。
答案 0 :(得分:4)
你是什么意思,“我需要在init之前定义这个方法,否则Python不知道它”?
>>> class A(object):
... def __init__(self):
... self.foo()
... def foo(self):
... print '42'
...
>>> A()
42
我通常在其他实例方法之前放置__ init __(),但在类方法/ property / attributes之后。
答案 1 :(得分: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)
答案 2 :(得分:1)
__init__
最常放在类的开头,因为它们是实例化类时运行的第一件事。由于你的情况要求它在课堂上进一步存在,所以其他开发者在课堂评论中留下一个注释会很好。
答案 3 :(得分:1)
我在开始时更喜欢使用init,但我实际上并不是那样编写类,而是像这样:
class AClass():
def __init__(self, methodToUse = 'defaultMethod'):
print getattr(self, methodToUse)()
def defaultMethod(self):
return 1
if __name__== "__main__":
AClass()
问题是在编译时(创建默认参数时),没有函数defaultMethod
,但如果你在__init__
中使用它,那么方法就在那里。