Python中的重载构造函数点?

dat*_*oat 3 python oop class constructor-overloading

我无法准确理解这段代码的用途

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
Run Code Online (Sandbox Code Playgroud)

然后是一堆@property方法,然后是像这样的setter方法,然后是main方法:

@property
def port(self):
    return self._port
@port.setter
def port(self, port):
    self._port = port
Run Code Online (Sandbox Code Playgroud)

我以前从未__init__在 Python 中的一个类下见过两个函数,我认为这是非 Python 的。这种逻辑的正确方法是什么?

Sha*_*ger 8

该代码所做的相当于根本没有定义第一个__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
Run Code Online (Sandbox Code Playgroud)

这也将允许提供一些参数,但不是全部。对于更复杂的情况,将备用构造函数定义为 a @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)
Run Code Online (Sandbox Code Playgroud)