如何在 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__()
应该像这样:
- 如果参数
name
它应该用于设置成员 self.name
及其值。其他成员也一样。
- 如果参数是
type(self)
那么外部对象的成员值应该被复制到自己的成员中 self.*
- 如果没有给出参数,则应使用默认值,否则(对我来说更好)会引发错误。
在其他语言中(例如 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?
从 docu 和一些 tutorials 我知道关于 *args
和 **kwargs
的基础知识。但我考虑如何以一种漂亮的 pythonic 方式将它们与 __init__
一起使用。
我添加了这个伪代码来描述需求。 __init__()
应该像这样:
- 如果参数
name
它应该用于设置成员self.name
及其值。其他成员也一样。 - 如果参数是
type(self)
那么外部对象的成员值应该被复制到自己的成员中self.*
- 如果没有给出参数,则应使用默认值,否则(对我来说更好)会引发错误。
在其他语言中(例如 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?