使用可选关键字参数定义类'__init__方法的更好方法是什么?

Joh*_*Doh 3 python python-3.x

我希望该类与以下内容相同:

class Player:
    def __init__(self, **kwargs):
        try:
            self.last_name = kwargs['last_name']
        except:
            pass
        try:
            self.first_name = kwargs['first_name']
        except:
            pass
        try:
            self.score = kwargs['score']
        except:
            pass
Run Code Online (Sandbox Code Playgroud)

但这看起来真的很草率.有没有更好的方法来定义这个__init__方法?我希望所有的关键字参数都是可选的.

Bha*_*Rao 11

如果你只有3个关键字args,那么这会更好.

class Player:

    def __init__(self, last_name=None, first_name=None, score=None):
        self.last_name = last_name
        self.first_name = first_name
        self.score = score
Run Code Online (Sandbox Code Playgroud)


the*_*orn 10

如果你只有3个参数,那么Bhargav Rao的解决方案更合适,但是如果你有很多潜在的参数,那么试试:

class Player:
    def __init__(self, **kwargs):
        self.last_name = kwargs.get('last_name')
        # .. etc.
Run Code Online (Sandbox Code Playgroud)

kwargs.get('xxx')将返回xxx密钥(如果存在),如果不存在则返回None..get如果xxx不在kwargs(而不是None)中,则返回可选的第二个参数,例如将属性设置为空字符串use kwargs.get('xxx', "").

如果你真的希望属性是未定义的,如果它不在kwargs,那么这将做到:

class Player:
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)
Run Code Online (Sandbox Code Playgroud)

这将是令人惊讶的行为所以我建议不要这样做.


Tan*_*lam 5

您可以使用关键字参数

class Player:

    def __init__(self, last_name=None, first_name=None, score=None):
        self.last_name = last_name
        self.first_name = first_name
        self.score = score

obj = Player('Max', 'Jhon')
print obj.first_name, obj.last_name
Run Code Online (Sandbox Code Playgroud)


Jhon Max
Run Code Online (Sandbox Code Playgroud)

带参数**kwargs

class Player:
    def __init__(self, **args):

        self.last_name = args.get('last_name')

        self.first_name = args.get('first_name')

        self.score = args.get('score', 0) # 0 is the default score.

obj = Player(first_name='Max', last_name='Jhon')

print obj.first_name, obj.last_name, obj.score
Run Code Online (Sandbox Code Playgroud)


Max Jhon 0
Run Code Online (Sandbox Code Playgroud)


mar*_*eau 5

这是一种可以轻松更改的方法:

class Player:
    _VALID_KEYWORDS = {'last_name', 'first_name', 'score'}

    def __init__(self, **kwargs):
        for keyword, value in kwargs.items():
            if keyword in self._VALID_KEYWORDS:
                setattr(self, keyword, value)
            else:
                raise ValueError(
                    "Unknown keyword argument: {!r}".format(keyword))
Run Code Online (Sandbox Code Playgroud)

示例用法:

Player(last_name="George", attitude="snarky")
Run Code Online (Sandbox Code Playgroud)

结果:

class Player:
    _VALID_KEYWORDS = {'last_name', 'first_name', 'score'}

    def __init__(self, **kwargs):
        for keyword, value in kwargs.items():
            if keyword in self._VALID_KEYWORDS:
                setattr(self, keyword, value)
            else:
                raise ValueError(
                    "Unknown keyword argument: {!r}".format(keyword))
Run Code Online (Sandbox Code Playgroud)