Точка перегруженного конструктора в Python? - PullRequest
3 голосов
/ 24 января 2020

У меня возникают проблемы с пониманием того, для чего этот фрагмент кода полезен для

class buildArgs:
    def __init__(self, host, port, user, dept):
        self._dept = dept
        self._host = host
        self._port = port
        self._user = user
        self._datacenter = datacenter
        self._path = path
    def __init__(self): 
        self._dept = None
        self._host = None
        self._port = None
        self._user = None
        self._datacenter = None
        self._path = None

Затем следует набор методов @property, за которыми следуют сеттеры, подобные этим, а затем метод main:

@property
def port(self):
    return self._port
@port.setter
def port(self, port):
    self._port = port

Я никогда раньше не видел двух __init__ функций в классе в Python, и я предполагаю, что это не pythoni c. Каков правильный подход для этого типа логи c?

1 Ответ

8 голосов
/ 24 января 2020

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

Вы можете получить что-то похожее на оба поведения, используя только первый конструктор и задав для всех параметров значение по умолчанию None:

def __init__(self, host=None, port=None, user=None, dept=None):
        self._dept = dept
        self._host = host
        self._port = port
        self._user = user

, что также позволило бы предоставить некоторые аргументы, но не все. Для более сложных случаев определите альтернативный конструктор как @classmethod (методы класса существуют главным образом для реализации альтернативных конструкторов), где он преобразует (или предоставляет) свои собственные аргументы в аргументы, ожидаемые первичным конструктором, затем заканчивается return cls(expected, arguments, here):

class buildArgs:
    def __init__(self, host, port, user, dept):
        self._dept = dept
        self._host = host
        self._port = port
        self._user = user

    @classmethod
    def from_the_void(cls):
        return cls(None, None, None, None)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...