python - Python中重载构造函数的要点?

标签 python class oop 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

接下来是一堆 @property 方法,后面是这样的 setter,然后是 main 方法:

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

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

最佳答案

该代码的作用相当于不定义第一个 __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)

关于python - Python中重载构造函数的要点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59887423/

相关文章:

python - 如何将我的 Django View 的 URL 设置为我网站的根域?

python - 添加 prefix_with 子句以插入特定类

python - 将变量指定为以正则表达式运算符 '^' 开头的值

java - _ClassInstance 符号?

java - Java 中的对象变量与类变量

python - 在解释器或编译器的上下文中,单元格是什么?

python - 更改父级继承的python类的方法

ios - 让一个 View Controller 听另一个

c# - 在派生类 C# 中扩展嵌套类

java - 我的程序不会从另一个类更新 TextView ,它每次都会退出,我不知道为什么?