如何在 Python 中以巧妙而优雅的方式将 *args 和 **kwargs 与 __init__ 一起使用?

How to use *args and **kwargs with __init__ in a smart and elegant way in Python?

从 docu 和一些 tutorials 我知道关于 *args**kwargs 的基础知识。但我考虑如何以一种漂亮的 pythonic 方式将它们与 __init__ 一起使用。 我添加了这个伪代码来描述需求。 __init__() 应该像这样:

在其他语言中(例如 C++),我只是重载构造函数。但是现在 Python 我不知道如何在一个函数中实现它。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class Foo:
    def __init__(self, *args, **kwargs):

    # if type() of parameter == type(self)
        # duplicate it

    # else
        # init all members with the parameters
        # e.g.
        # self.name = name

# explicite use of the members
f = Foo(name='Doe', age=33)
# duplicate the object (but no copy())
v = Foo(f)
# this should raise an error or default values should be used
err = Foo()

我不确定 Python2 和 3 之间的解决方案是否不同。因此,如果有差异,请告诉我。我会将标签更改为 Python3.

你可以用文字描述你写的内容。也就是说,

def __init__(self, *args, **kwargs):
    if len(args) == 1 and not kwargs and isinstance(args[0], type(self)):
        other = args[0]
        # copy whatever is needed from there, e. g.
        self.__dict__ = dict(other.__dict__) # copy it!
    else:
        self.__dict__ = kwargs
        # what do we do with args here?