在类的开始还是结束放置__init__更符合最佳实践?

4 投票
4 回答
2788 浏览
提问于 2025-04-17 01:41

考虑以下代码:

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)

撰写回答