Лучше ли размещать __init__ в начале или конце класса? - PullRequest
3 голосов
/ 07 сентября 2011

Рассмотрим следующий код:

class AClass():

    def defaultMethod(self):
        return 1

    def __init__(self, methodToUse = defaultMethod):
        print (methodToUse(self))

if __name__== "__main__":
    AClass()

В этом случае нельзя переместить defaultMethod ниже метода __init__, если я это сделаю, это вызовет «NameError: имя 'defaultMethod' не определено"

Это означает, что мне нужно определить этот метод до того, как __init__, иначе Python не узнает об этом. Это снова означает, что у меня больше нет __init__ в качестве первого метода, что заставляет меня задуматься о том, обычно ли метод __init__ помещать в конец класса или в начало.

Ответы [ 4 ]

4 голосов
/ 07 сентября 2011

Я думаю, вы делаете что-то немного странное. Вы все равно должны поставить __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)
4 голосов
/ 07 сентября 2011

Что вы имеете в виду: «Мне нужно определить этот метод до того, как init, иначе Python не узнает об этом»?методы класса / свойство / атрибуты.

1 голос
/ 07 сентября 2011

Я предпочитаю init в начале, и я бы на самом деле не писал этот класс, а скорее как-то так:

class AClass():
    def __init__(self, methodToUse = 'defaultMethod'):
        print getattr(self, methodToUse)()

    def defaultMethod(self):
        return 1

if __name__== "__main__":
    AClass()

Проблема в том, что во время компиляции (когда создаются аргументы по умолчанию), нет функции defaultMethod, но если вы используете ее внутри __init__, то метод есть.

1 голос
/ 07 сентября 2011

__init__ чаще всего помещается в начало класса, так как они запускаются первым при создании экземпляра класса.Поскольку ваша ситуация требует, чтобы он существовал дальше в классе, другим разработчикам было бы хорошо оставить примечание в комментариях для класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...