将__init__放在课程的开头或结尾是最佳做法吗?

时间:2011-09-07 14:05:48

标签: python design-patterns

请考虑以下代码:

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__方法放在类的末尾或开头。

4 个答案:

答案 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__中使用它,那么方法就在那里。